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函数的原理在红宝书中有说明,仅仅有对照了红宝书,才知道红宝书的定位:高级工具书. 蓝宝书作为入门级书籍,以较快的速度让读者敲到代码去思考,总遗留了须要 ...
随机推荐
- 『TCP/IP详解——卷一:协议』读书笔记——16
2013-08-26 22:50:54 6.4 ICMP时间戳请求与应答 ICMP时间戳请求允许系统向另一个系统查询当前的时间.返回的建议值是自午夜开始计算的毫秒数(协调的统一时间,Coordinat ...
- Freemarker 内置函数 数字、字符串、日期格式化用法介绍
在用FreeMarker过程中,感觉FreeMarker的字符串,日期,集合等处理能力还是很强大的,上网搜了一些资料,整理如下,以便能帮助大家更熟练的应用Freemarker完成项目开发. 一.Seq ...
- MongoDB学习笔记-04 索引
索引是用来加速查询的.有了索引之后,数据库不必进行全表扫描,只需先在索引中查找,再根据找到的索引查找数据.MongoDB的索引几乎和传统关系型数据库一样. 创建索引 创建索引是在相应的集合中使用ens ...
- Swift让编程更简单 人人都是开发者
全称为苹果全球开发者大会的WWDC,每年的这个时候,都会如这段时间前后所举行的Google I/O 和微软的BUILD开发者会议一样,吸引全球科技媒体的目光.近几年来,因为在会上爆的猛料越来越多,“开 ...
- 解析html并使用canvas进行渲染
在学习html5的时候,使用canvas实现了对html文本的解析和渲染,支持的tag有<p>.<i>.<b>.<u>.<ul>.<l ...
- mysql 条件统计
问题描述为使讨论简单易懂,我将问题稍作简化,去掉诸多的背景. 从前有一个皇帝,他有50个妃子,这些妃子很没有天理的给他生了100,000个儿子,于是,皇帝很苦恼,海量的儿子很难管理,而且,他想知道每个 ...
- Web利器---fidder使用
fiddler工具,主要看中其三点优势:1.功能强大,其他工具有的功能它也有,其他工具没有的功能它也有,支持http,https,ftp等协议:2.完全免费,长期免费.3.所有的浏览器可以使用,所有的 ...
- WebView一般用法总结
下面是webview常规的用法: import android.annotation.SuppressLint;import android.app.Activity;import android.o ...
- ASP.NET 开发必备知识点(1):如何让Asp.net网站运行在自定义的Web服务器上
一.前言 大家都知道,在之前,我们Asp.net 的网站都只能部署在IIS上,并且IIS也只存在于Windows上,这样Asp.net开发的网站就难以做到跨平台.由于微软的各项技术的开源,所以微软自然 ...
- objective-c(内存管理)
本文主要记录objective-c 内存管理的知识点: 1.objective-c的对象都是分配内存在堆上,与C的mallock和C++的new类似,只有int等系统变量分配内存在栈上: 2.obje ...