LINQ 和泛型

原创|其它|编辑:郝浩|2009-05-18 10:33:11.000|阅读 757 次

概述:在.net2.0中引用了泛型,泛型是我在.net 2.0众多特性中最喜欢的一个,可以说泛型给我们的编程思惟上带来了不小的影响。.net2.0和.net1.1比拟,良多功能用泛型和不用泛型都可以实现,例如过滤一个数组元素。但使用泛型会带来良多额外的好处,或者说泛型能办良多非泛型时代不能完成的任务。

# 界面/图表报表/文档/IDE等千款热门软控件火热销售中 >>

     在.net2.0中引用了泛型,泛型是我在.net 2.0众多特性中最喜欢的一个,可以说泛型给我们的编程思惟上带来了不小的影响。.net2.0和.net1.1比拟,良多功能用泛型和不用泛型都可以实现,例如过滤一个数组元素。但使用泛型会带来良多额外的好处,或者说泛型能办良多非泛型时代不能完成的任务。

 


      案例一:对增删改查用面向对象进行包装,假如想把客户端与业务处理以及数据处理部门更好的解耦,假如在.net1.1时代是很难实现的。像良多开源的框架,都有强盛的ORM编程模式,它使得所有的增删改查都终极同一表现在接口方法上,接受的参数恰是实体对象而不依靠于详细的数据源类型。

 


      案例二:IComparer<T>接口的扩展,IComparer<T>接口对于实体集的排序提供了非常灵活的方案,比起IComparer接口,省去了烦人的类型转换以及类型安全题目。我们还可以对IComparer<T>接口进行更进一步的封装,让它在客户端更加解耦,可以参数这篇文章:泛型真的很神奇

 


      案例三:对于数组或者是实体集的查询,说的直接点就是实现了IEnumerable,IEnumerable<T>或派生类型,如 IQueryable<T>接口的集合。传统的IEnumerable接口在查询数据时都需要用到foreach操纵,而泛型IEnumerable接口或派生类型,如 IQueryable<T>接口,提供了更加简朴而且更加高效安全的查询模式。

 

      示例:下面一个简朴的示例来说明下LINQ中的泛型应用。
            

 

//声名一个整形数组
int[] num = { 012345678 };
//查询数组中元素值大于1的集合
//传统方式
            ArrayList listArr = new ArrayList();
            
foreach (int i in num)
            {
                
if (i < 1)
                {
                    listArr.Add(i);
                }
            }
//LINQ方式
            
//匿名类型方式
            var list = from _num in num
                       
where _num > 1
                       select _num;

 

 

 

        非泛型方式的缺点:
          1):从代码量来看,比LINQ方式多;
          2):ArrayList相对泛型在机能上具有先天上的劣势。
          3):LINQ充分利用了泛型的长处再结合LINQ优良的查询方式,使得代码的可阅读性进一步加强。  

 

       下面是我结合MSDN总结的一些LINQ中的泛型部门用法,不足处忘指正。  
            
       第一:LINQ查询中的IEnumerable<T>变量。下面代码中显示类型方式中IEnumerable<int>,就表明查询出来的集体里面都只会存放0个或者n个整形类型的数据。

 

//显示类型方式
IEnumerable<int> list2 = from _num in num
                                     
where _num > 1
                                     select _num;

 

 

 

       第二:系统推断变量类型。因为.net3.0推出了匿名类型,所以我们可以把IEnumerable<int>直接写成var,让系统去判定变量的类型。
      

 

//匿名类型方式
var list = from _num in num
                       
where _num > 1
                       select _num;

 


       第三:查询操纵中的类型关系,第二条中我们知道可以引用匿名类型来让系统来判定变量的类型,但要写出有效的查询,我们最好了解对象之间的联系关系关系。LINQ 查询操纵在数据源、查询本身及查询执行中是强类型的。查询中变量的类型必需与数据源中元素的类型和 foreach 语句中迭代变量的类型兼容。

 


        1):查询操纵中不需要转换数据源。查询的结果集元素类型和数据源元素类型相同。第一条中的显示类型方式查询中,记实集元素类型为IEnumerable<int>,假如我们要对集合做foreach操纵,我们需要这样写:

 

        

 

            foreach (int i in list2)
            {
                
//dosomething
            }
            
foreach (var  i in list2)
            {
                
//dosomething
            }

 


        2):查询操纵中需要类型转换。假如原始数据源和最后查询数据源的元素类型不同,说明需要类型转换,下面是一个学生类的集合,但我们只需要返回知足前提的学生的电话号码并不需要其它信息,这里为了查询的有效性,并不需要知足前提学生的所有信息,即不需要返回整个student,这相称是SQL中的select *。下面是一个学生类:

 

/// <summary>
    
/// 学生实体
    
/// </summary>
    class student
    {
        
/// <summary>
        
/// 姓
        
/// </summary>
        public string sFirst
        {
            
get;
            
set;
        }
        
/// <summary>
        
/// 名
        
/// </summary>
        public string sLast
        {
            
get;
            
set;
        }
        
/// <summary>
        
/// 电话
        
/// </summary>
        public string sPhone
        {
            
get;
            
set;
        }
    }

 

   

 

          构造学生数据源      

 

//学生姓名电话集合
            IEnumerable<student> listStudent = new List<student> {
                                                  
new student {sFirst = "",sLast ="",sPhone ="1111111"},
                                                  
new student {sFirst ="",sLast ="",sPhone ="2222222"},
                                                  
new student {sFirst ="",sLast ="",sPhone ="3333333"}
            };

 

           

 

           查询姓李的学生的电话号码.

 

IEnumerable<string> listStudentQuery = from item in listStudent
                                  
where item.sFirst == ""
                                  select item.sPhone;

 

 

 

           预测: 假如原始数据源实现了IEnumerable或者是IEnumerable<T>,那么查询出来的结果集也会实现数据源的接口。这里没有找到相关资料,有的朋友利便给出下。所以类型为IEnumerable<student>的数据源,得到的查询结果也会实现IEnumerable<T>接口。

 

           错误查询:
            

 

IQueryable <string> listStudentQuery2 = from item in listStudent
                                                   
where item.sFirst == ""
                                                   select item.sPhone;

 

 

 

           3):让系统完全代办代理数据类型推断操纵。即查询时我们不显示指定数据类型。查询姓李的学生的电话号码
            

 

var  listStudentQuery2 = from item in listStudent
                                                   
where item.sFirst == ""
                                                   select item.sPhone;
            
foreach (var  s in listStudentQuery2)
            {
                
//dosomething

            }

标签:

本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@evget.com

文章转载自:博客园

为你推荐

  • 推荐视频
  • 推荐活动
  • 推荐产品
  • 推荐文章
  • 慧都慧问
扫码咨询


添加微信 立即咨询

电话咨询

客服热线
023-68661681

TOP