C# LINQ需求实现演化
Linq是C#3.0引入的,在C#2.0实现从集合中过滤符合条件的记录实现方式。
假设有一个Book类,以及一个Book类的集合,现在需要从集合中查找出单价大于50的Book。
1、固定查询字段的实现方式:
Book.cs类:
using System;
using System.Collections.Generic;
using System.Text; namespace LINQTest
{
public class Book
{
public string Title { get; set; } public decimal Price { get; set; } public string Author { get; set; } public string ISBN { get; set; }
}
}
Help.cs类:
using System;
using System.Collections.Generic;
using System.Text; namespace LINQTest
{
public class Helper
{
public static IList<Book> SearchBookByPrice()
{
IList<Book> books = new List<Book> {
new Book{Title="Book1", Author="Author1", ISBN="ISBN1", Price=},
new Book{Title="Book2", Author="Author2", ISBN="ISBN2", Price=},
new Book{Title="Book3", Author="Author3", ISBN="ISBN3", Price=},
new Book{Title="Book4", Author="Author4", ISBN="ISBN4", Price=}
}; IList<Book> results = new List<Book>();
foreach (Book book in books)
{
if (book.Price >= )
{
results.Add(book);
}
} return results;
}
}
}
Program.cs类:
using System;
using System.Collections.Generic;
using System.Text; namespace LINQTest
{
class Program
{
static void Main(string[] args)
{
foreach (Book book in Helper.SearchBookByPrice())
{
Console.WriteLine("{0}-{1}", book.Title, book.Price);
}
}
}
}
上面的代码中实现了根据Price查询集合中大于50的记录。但是当需求有变动,需要根据Title来查询时,则上面的实现方法需要另外进行编写按Title查询的方法。
2、不固定查询字段的实现方式
查询条件最后返回的只是true或false,在新定义的方法中,只要if语句中返回为true的记录,添加到集合中即可,而不需要去知道具体是什么查询条件。
Helper.cs类:
using System;
using System.Collections.Generic;
using System.Text; namespace LINQTest
{
public class Helper
{
public delegate bool Condition(Book book); public bool ConditionTitle(Book book)
{
return book.Title == "Book2";
} public bool ConditionPrice(Book book)
{
return book.Price >= ;
} public static IList<Book> SearchBookByCondition(Condition condition)
{
IList<Book> books = new List<Book> {
new Book { Title = "Book1", Author = "Author1", ISBN = "ISBN1", Price = },
new Book { Title = "Book2", Author = "Author2", ISBN = "ISBN2", Price = },
new Book { Title = "Book3", Author = "Author3", ISBN = "ISBN3", Price = },
new Book { Title = "Book4", Author = "Author4", ISBN = "ISBN4", Price = }
}; IList<Book> results = new List<Book>(); foreach (Book book in books)
{
if (condition(book))
{
results.Add(book);
}
} return results;
}
}
}
Program.cs类:
using System;
using System.Collections.Generic;
using System.Text; namespace LINQTest
{
class Program
{
static void Main(string[] args)
{
//Helper.Condition condition = new Helper.Condition(new Helper().ConditionTitle);
Helper.Condition condition = new Helper().ConditionTitle;
foreach (Book book in Helper.SearchBookByCondition(condition))
{
Console.WriteLine("{0}-{1}", book.Title, book.Price);
}
}
}
}
以上的实现方式采用委托delegate,在C#2.0中还提供了匿名方法,集合中过滤查询条件的代码可修改为:
Helper.Condition condition = delegate(Book book) { return book.Title == "Book2"; };
IList<Book> results = Helper.SearchBookByCondition(delegate(Book book) { return book.Title == "Book2"; });
在C#3.0提供了Lambda表达式,则实现集合过滤方式为:
IList<Book> results = Helper.SearchBookByCondition(book => book.Title == "Book2");
但这样实现每次都要带类名Helper,我们希望IList自身就具有这个方法,C#3.0提供了扩展方法。
3、C#3.0扩展方法实现方式
public static class Helper
{
public delegate bool Condtion(Book book); public static IList<Book> Where(this IList<Book> books, Condtion condition)
{
IList < Book > results = new List<Book>();
foreach (Book book in books)
{
if (condition(book))
{
results.Add(book);
}
}
return results;
}
}
IList<Book> results = books.Where(book => book.Title == "Book2");
5、IEnumberable实现方式
由于IList都继承自IEnumberable,则可以通过扩展IEnumberable来实现。
public static class Helper
{
public delegate bool Condtion<T>(T t);
public static IEnumerable<T> Where<T>(this IEnumerable<T> items, Condtion<T> condition)
{
foreach (T t in items)
{
if (condition(t))
{
yield return t;
}
}
}
}
6、通用扩展类
using System;
using System.Collections.Generic;
using System.Text; namespace LINQTest
{
public class Extension
{
public delegate TResult Func<T, TResult>(T t); public static IEnumerable<T> Where<T>(this IEnumerable<T> source, Func<T, bool> filter)
{
foreach (T item in source)
{
if (filter(item))
{
yield return item;
}
}
} public static IEnumerable<TResult> Select<T, TResult>(this IEnumerable<T> source, Func<T, TResult> selector)
{
foreach (T item in source)
{
yield return selector(item);
}
}
}
}
var result = books.Where(book => book.Title == "Book2").Select(book => new {
Key = book.Title,Value=book.Price
});
C# LINQ需求实现演化的更多相关文章
- LINQ系列:C#中与LINQ相关特性
1. 匿名类型 通过关键字var定义匿名类型,编译器将根据运算符右侧表达式的值来发出一个强类型. 使用匿名类型时要遵守的一些基本规则: ◊ 匿名类型必须有一个初始化值,而且这个值不能是空值(null) ...
- 开始写博客,学习Linq(1)
摘自<linq实战>原文: 软件很简单.它可以归结为两件事情:代码和数据. 开发软件却并非那么简单,其中很重要的一项任务就是编写处理数据的代码. 无论选择了哪种语言,在程序开发得某个时候你 ...
- python工业互联网应用实战2—从需求开始
前言:随着国家工业2025战略的推进,工业互联网发展将会提速,将迎来一个新的发展时期,越来越多的企业开始逐步的把产线自动化,去年年底投产的小米亦庄的智能工厂就是一个热议的新闻.小米/华为智能工厂只能说 ...
- Spring Boot
Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置.通过 ...
- Solr图形化界面banana:除Hue之外的选择
最近Hue+Solr 方案原型验证有了一些进展.正好也收到了Google的大数据专家Sam的来件询问进展,我答复如下: Sam, 你好. 已经把Kafka+flume+solr的实时索引搭建起来了, ...
- 深入学习微框架:Spring Boot(转)
转:http://www.infoq.com/cn/articles/microframeworks1-spring-boot/ 相关参考: https://spring.io/guides/gs/s ...
- 深入学习微框架:Spring Boot - NO
http://blog.csdn.net/hengyunabc/article/details/50120001 Our primary goals are: Provide a radically ...
- 深入学习微框架:Spring Boot
Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置.通过 ...
- OpenGL蓝宝书第七章:立体天空和纹理折射、双纹理(下)
对照了蓝宝书,才知道红宝书的长处. reflect函数的原理在红宝书中有说明,仅仅有对照了红宝书,才知道红宝书的定位:高级工具书. 蓝宝书作为入门级书籍,以较快的速度让读者敲到代码去思考,总遗留了须要 ...
随机推荐
- VS2010 密钥问题
密钥:YCFHQ9DWCYDKV88T2TMHG7BHP ①在VS2010安装包中找到setup==>setup.sdb 的Product Key把密钥改为上面的就可以了 ②不想重装那就在控制面 ...
- Android--网络请求
1.Android 上发送HTTP 请求的方式一般有两种,HttpURLConnection 和 HttpClient: 2.HttpURLConnection 的用法: 1)获取 HttpURLCo ...
- python 装饰器初步学习
第一步 简单函数 ''' 简单的函数:调用两次''' def myfunc(): print ('myfunc() called.') myfunc() myfunc() 第二步 装饰器为调用函数提供 ...
- CSS浮动(float,clear)通俗讲解
首先要知道,div是块级元素,在页面中独占一行,自上而下排列,也就是传说中的流.如下图: 可以看出,即使div1的宽度很小,页面中一行可以容下div1和div2,div2也不会排在div1后边,因为d ...
- HashSet和HapMap取distinct value
public class TestHashSetAndHashMap { private final int setNum=5000; @Test public void doTest(){ List ...
- windows management instrumentation服务未启动-解决脚本
桌面新建.txt文件 将以下代码放入 保存为.bat文件 执行即可 @echo on cd /d c:\temp if not exist %windir%\system32\wbem goto Tr ...
- Chrome开发者工具不完全指南(六、插件篇)
本篇是Chrome开发者工具的结尾篇,最后为大家介绍几款功能强大的插件.在chrome商店里面有很多插件,没事建议大家去逛逛.不过需要FQ,所以诸位请自备神器.一.皮肤插件 首先是大家期盼已久,翘首以 ...
- 规范化的软件项目演进管理--从 Github 使用说起
规范化的软件项目演进管理 从 Github 使用说起 1 前言 首先,本文的层次定位是:很基本很基础的 Github 工具的入门级应用,写给入门级的用户看的. 基本上工作过几年的人,下面描述的这些 ...
- kali linux 2016.1 滚动更新源
修改 /etc/apt/sources.list #kali官方源 deb http://http.kali.org/kali kali-rolling main non-free contrib ...
- 作业三 代码规范 代码复审 PSP
1.是否需要有代码规范(5分) 对于是否需要有代码规范,请考虑下列论点并反驳/支持: 1这些规范都是官僚制度下产生的浪费大家的编程时间.影响人们开发效率, 浪费时间的东西. 反对.我并不认为代码规范都 ...