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需求实现演化的更多相关文章

  1. LINQ系列:C#中与LINQ相关特性

    1. 匿名类型 通过关键字var定义匿名类型,编译器将根据运算符右侧表达式的值来发出一个强类型. 使用匿名类型时要遵守的一些基本规则: ◊ 匿名类型必须有一个初始化值,而且这个值不能是空值(null) ...

  2. 开始写博客,学习Linq(1)

    摘自<linq实战>原文: 软件很简单.它可以归结为两件事情:代码和数据. 开发软件却并非那么简单,其中很重要的一项任务就是编写处理数据的代码. 无论选择了哪种语言,在程序开发得某个时候你 ...

  3. python工业互联网应用实战2—从需求开始

    前言:随着国家工业2025战略的推进,工业互联网发展将会提速,将迎来一个新的发展时期,越来越多的企业开始逐步的把产线自动化,去年年底投产的小米亦庄的智能工厂就是一个热议的新闻.小米/华为智能工厂只能说 ...

  4. Spring Boot

    Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置.通过 ...

  5. Solr图形化界面banana:除Hue之外的选择

    最近Hue+Solr 方案原型验证有了一些进展.正好也收到了Google的大数据专家Sam的来件询问进展,我答复如下: Sam, 你好. 已经把Kafka+flume+solr的实时索引搭建起来了, ...

  6. 深入学习微框架:Spring Boot(转)

    转:http://www.infoq.com/cn/articles/microframeworks1-spring-boot/ 相关参考: https://spring.io/guides/gs/s ...

  7. 深入学习微框架:Spring Boot - NO

    http://blog.csdn.net/hengyunabc/article/details/50120001 Our primary goals are: Provide a radically ...

  8. 深入学习微框架:Spring Boot

    Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置.通过 ...

  9. OpenGL蓝宝书第七章:立体天空和纹理折射、双纹理(下)

    对照了蓝宝书,才知道红宝书的长处. reflect函数的原理在红宝书中有说明,仅仅有对照了红宝书,才知道红宝书的定位:高级工具书. 蓝宝书作为入门级书籍,以较快的速度让读者敲到代码去思考,总遗留了须要 ...

随机推荐

  1. [UCSD白板题 ]Small Fibonacci Number

    Problem Introduction The Fibonacci numbers are defined as follows: \(F_0=0\), \(F_1=1\),and \(F_i=F_ ...

  2. XML转JSON

    Step 1 : 下载 java-json.jar http://www.java2s.com/Code/JarDownload/java/java-json.jar.zip Step 2: 增加 j ...

  3. Codeforces #380 div2 D(729D) Sea Battle

    D. Sea Battle time limit per test 1 second memory limit per test 256 megabytes input standard input ...

  4. [UE4]逻辑状态机组件

    逻辑状态机 为了实现对目标状态的控制,以及广播改变状态后的事件,可在蓝图中继续处理不同状态下的行为. 实现过程: 1.继承ActorComponent实现LogicStateMachine: 2.被击 ...

  5. JSON 基础解释.

    JSON.(JavaScript Object Notation) JSON 指的是 JavaScript 对象表示法(JavaScript Object Notation) JSON 是轻量级的文本 ...

  6. [转] spring @Entity @Table

    实体bean,entity 注解设置 持久化是位于JDBC之上的一个更高层抽象.持久层将对象映射到数据库,以便在查询.装载.更新或删除对象的时候,无须使用像JDBC那样繁琐的API.EJB的早期版本中 ...

  7. myeclipse导入项目出现乱码

    (1)修改整个工作空间的编码方式: Window->Preferences->General->Workspace->Text file Encoding 在 Others 里 ...

  8. How to Install JAVA 8 (JDK/JRE 8u111) on Debian 8 & 7 via PPA

    Oracle JAVA 8 Stable release has been released on Mar,18 2014 and available to download and install. ...

  9. MyEclipse使用技巧

    1.    大小写切换:  Ctrl + Shift + X   大写: Ctrl + Shift + Y   小写: 2.   自动导包: Ctrl + Shift + O 3.   运行前自动保存 ...

  10. 搭建 SubversionEdge for VS

    1. 需要软件 SubversionEdge , AnkhSvn,TortoiseSVN: 2. 安装3个软件,一路Next 3. 安装完SubversionEdge 后,会打开一个网页http:// ...