Linq起源

简介: 书籍,书籍集合,从书籍集合中查找符合条件的书籍  (一)书籍 public class Book{   public int Unid { get; set; }   public string Name { get; set; }   public int Price { get; se...

书籍,书籍集合,从书籍集合中查找符合条件的书籍 

(一)书籍

public   class  Book
{
   
public   int  Unid {  get set ; }
   
public   string  Name {  get set ; }
   
public   int  Price {  get set ; }
   
public   string  Publisher {  get set ; }
}

 

(二)书籍集合

public   static   class  BookHelper
{
    
public   static  IList < Book >  SearchBook(IList < Book >  list)
    {
        IList
< Book >  _list  =   new  List < Book > (); 
        
foreach  (Book book  in  list)
        {
           
if  (book.Price  <   100 )
              _list.Add(book);
        }
        
return  _list;
    }
}

 

从书籍集合中查找价格在100以下的书籍。这里采用了扩展方法。所以可以以

BookHelper.SearchBook的方式来调用方法

(三)测试

1)准备

IList < Book >  _list  =   new  List < Book > ();

[SetUp]
public   void  Init()
{
   _list.Add(
new  Book { Price  =   20 , Name  =   " book1 "  });
   _list.Add(
new  Book { Price  =   320 , Name  =   " book6 "  });
   _list.Add(
new  Book { Price  =   200 , Name  =   " book2 "  });
   _list.Add(
new  Book { Price  =   80 , Name  =   " book3 "  });
   _list.Add(
new  Book { Price  =   870 , Name  =   " book4 "  });
   _list.Add(
new  Book { Price  =   250 , Name  =   " book5 "  });
}

 

2)测试

[Test(Description = " 原始方法 " )]
public   void  TestOrigin()
{
    List
< Book >  _newList  =  BookHelper.SearchBook(_list)  as  List < Book > ;

   
foreach  (Book book  in  _newList)
      Console.WriteLine(book.Name);
}

 

(四)现在把价格判断分离到独立的方法

public   static  IList < Book >  SearchBook1(IList < Book >  list)
{
   IList
< Book >  _list  =   new  List < Book > ();

   
foreach  (Book book  in  list)
   {
      
if  (CheckCondition(book))
                _list.Add(book);
   }
   
return  _list;
}

public   static   bool  CheckCondition(Book book)
{
    
if  (book.Price  <   100 )
        
return   true ;
    
return   false ;
 }

 

(五)测试

[Test(Description  =   " 分离判断方法 " )]
public   void  TestOrigin1()
{
    List
< Book >  _newList  =  BookHelper.SearchBook1(_list)  as  List < Book >

    
foreach  (Book book  in  _newList)
        Console.WriteLine(book.Name);
}

 

(六)通过委托来传递判断方法

public   delegate   bool  DCheckCondition(Book book);
///   <summary>
///  传递分离的判断方法
///   </summary>
///   <param name="list"></param>
///   <returns></returns>
public   static  IList < Book >  SearchBook2(IList < Book >  list,DCheckCondition check)
{
    IList
< Book >  _list  =   new  List < Book > (); 

    
foreach  (Book book  in  list)
    {
        
if  (check(book))
           _list.Add(book);
    }

    
return  _list;
}

 

(七)测试

[Test(Description  =   " 传递分离的判断方法 " )]
public   void  TestOrigin2()
{
    List
< Book >  _newList  =  BookHelper.SearchBook2(_list,BookHelper.CheckCondition)  as  List < Book > ;

    
foreach  (Book book  in  _newList)
        Console.WriteLine(book.Name);
}

 

(八)自定义判断方法

[Test(Description  =   " 代理传递分离的判断方法 " )]
public   void  TestOrigin3()
 {
      List
< Book >  _newList  =  BookHelper.SearchBook2(_list, 
      
new  LOrigin.BookHelper.DCheckCondition(CheckCondition))  as  List < Book > ;

      
foreach  (Book book  in  _newList)
            Console.WriteLine(book.Name);


public   bool  CheckCondition(Book book)
{
   
if  (book.Price  <   100 )
        
return   true ;
   
return   false ;
}

 

(九)使用匿名方法来替换

[Test(Description  =   " 匿名方法 " )]
public   void  TestOrigin4()
{
    IList
< Book >  _newList  =  BookHelper.SearchBook2(_list, 
               
delegate (Book book) {  return  book.Price  <   100 ; });
    
foreach  (Book book  in  _newList)
        Console.WriteLine(book.Name);
}

 

(十)匿名方法符号化

[Test(Description  =   " 匿名方法的符号化 " )]
public   void  TestOrigin5()
{
    IList
< Book >  _newList  =  BookHelper.SearchBook2(_list,book  =>  book.Price  < 100 );
    
foreach  (Book book  in  _newList)
       Console.WriteLine(book.Name);
}

 

(十一)

[Test(Description  =   " IList的静态方法Where,并采用goes to " )]
public   void  TestOrigin6()
{
    IList
< Book >  _newList  =  _list.Where(book  =>  book.Price  <   100 ).ToArray < Book > ();

    
foreach  (Book book  in  _newList)
        Console.WriteLine(book.Name);
}

 

不管是IList还是IList都可以使用这个Where方法了但是做集合操作的时候我们不仅仅需要Where,还需要OrderByGroup等等,我想把所有的SQL能干的都移植过来。当然微软也意识到了这点,如是在.net 3.5里,微软发布了我们梦寐以求的Linq,将查询集成到语言里面来。它给IEnumerable添加了很多扩展方法,这样你可以很自然的去调用。你可以使用Reflector打开System.Core.dll,打开System.Linq命名空间,在这个命名空间里有一个Enumerable类,这里面就是微软为我们添加的扩展方法,看看,是不是SQL里所有的东西都可以在这里找到了

更多内容请见:http://kb.cnblogs.com/zt/linq/

博客园大道至简

http://www.cnblogs.com/jams742003/

转载请注明:博客园

目录
相关文章
|
Kubernetes Cloud Native 应用服务中间件
【云原生】使用k8s创建nginx服务—通过ingress类型暴露
【云原生】使用k8s创建nginx服务—通过ingress类型暴露
291 0
|
7月前
|
人工智能 数据可视化 API
自动查文献+写代码+跑数据+出报告!港大开源 Auto Deep Research 搞定科研全流程
Auto-Deep-Research 是一款由香港大学开源的个人 AI 助理,基于模块化多 Agent 架构,专注于深度研究任务,兼容多种大语言模型,并提供一键启动和文件解析等强大功能。
547 4
自动查文献+写代码+跑数据+出报告!港大开源 Auto Deep Research 搞定科研全流程
|
开发框架 .NET 中间件
七天.NET 8操作SQLite入门到实战 - (2)第七天Blazor班级管理页面编写和接口对接
七天.NET 8操作SQLite入门到实战 - (2)第七天Blazor班级管理页面编写和接口对接
264 7
|
7月前
|
缓存 安全 数据可视化
如何让私有化部署不影响用户体验?产品经理必读指南
本文探讨了在数字化产品竞争中,用户体验(UX)与用户界面(UI)设计对产品成功的重要性。合理的UX设计能降低学习成本、提高效率,出色的UI设计则增强视觉吸引力和易用性。同时,随着数据安全需求提升,私有化部署成为企业重要考量。文章从用户导向设计、简化交互、优化性能等方面阐述如何提升用户体验,并结合私有化部署需求,探讨安全与体验的平衡点,确保产品既安全又易用。
|
11月前
|
存储 固态存储 数据库
|
11月前
|
缓存 运维 Docker
容器化运维:Docker Desktop 占用磁盘空间过大?教你轻松解决!
Windows Docker Desktop 使用过程中,因镜像、容器数据及构建缓存的累积,可能导致磁盘空间占用过高。通过删除无用镜像与容器、压缩磁盘以及清理构建缓存等方法,可有效释放空间。具体步骤包括关闭WSL、使用`diskpart`工具压缩虚拟磁盘、执行`docker buildx prune -f`清理缓存等。这些操作能显著减少磁盘占用,提升系统性能。
2784 4
|
机器学习/深度学习 存储 缓存
【机器学习】随机森林、AdaBoost、GBDT、XGBoost从零开始理解
介绍了机器学习中的几种集成学习算法,包括随机森林、AdaBoost、梯度提升决策树(GBDT)和XGBoost,解释了它们的概念、优缺点、算法过程以及系统设计。
1096 5
【机器学习】随机森林、AdaBoost、GBDT、XGBoost从零开始理解
|
Prometheus Kubernetes 网络协议
k8s学习笔记之CoreDNS
k8s学习笔记之CoreDNS
|
运维 安全 物联网
带你读《网络安全等级保护2.0定级测评实施与运维》——3.2 确定定级对象
带你读《网络安全等级保护2.0定级测评实施与运维》——3.2 确定定级对象
带你读《网络安全等级保护2.0定级测评实施与运维》——3.2  确定定级对象
|
开发框架 小程序 JavaScript
微信小程序与vue区别
微信小程序与vue区别