zoukankan      html  css  js  c++  java
  • LINQ

    1、泛型参数命名规范
    TSource,输入参数类型
    TResult,输出参数类型
    TKey,用于排序、分组、或者
    2、OfType() 比如在Array集合中筛选出指定类型的数据;比如从一堆父类中查找出指定的子类,用得比较多
    OfType()方法也用于筛选。 与其他运算符不同的是,OfType()定义在IEnumerable上,而不是IEnumerable<T>,它的作用是从非泛型集合中筛选出某一类型的成员并返回
    IEnumerable<T>。  
    3、Cast()  比如Array集合,我们把里面的数据全部转换为int类型,但是转换不成功会抛出异常 
    4、调用Orderby还想继续排序就ThenBy()
    5、Select()投影,可以直接投影new一个对象,但可以有个索引在里面进行操作
    var query = col.Select((x, index) => new { Title = x.Name, Index = index}),
    比如MVC网站的下拉列表填充数据:
    IEnumerable<SelectListItem> list =
    col.Select(x => new SelectListItem { Text = x.Name, Value = x.Code });  
    6.Take()和Skip()   取和跳过,sql中的top可以为take,用于分页
    7、TakeWhile()和SkipWhile() 如果是进行过排序的集合就有用了
    取当条件不满足时继续,跳过不满足的。
    int[] array = { 1, 2, 10, 4, 5};
    var query = array.TakeWhile(x => x <= 5); // 输出1,2 
    var query = array.SkipWhile(x => x <= 5); // 输出10,4,5  
    8、Reverse()  反转序列
    9、DefaultIfEmpty()  当序列为空时,DefaultIfEmpty()为序列添加一个元素,使用元素的默认值,或者指定元素的值,例如:  
     int[] array = { };
    var query = array.DefaultIfEmpty(); // 输出0
    var query2 = array.DefaultIfEmpty(100); // 输出100  
    注意:因为int是值类型,默认值是0.当为类类型的时候,默认值为null,如果不指定一个值就会抛出未将对象引用到实例
    10.Distinct()  去重
    值类型:判断序列元素是否重复,需要元素实现IComparable<T>接口,值类型实现了这个接口。  
    自定义类型:我们可以调用Distinct()的重载方法,传递一个IEqualityComparer<T>类型,它包含了对象比较的算法  ,因此,再建一个类PointComparer,让它去实现IEqualityComparer<T>接口:
    public class PointComparer : IEqualityComparer<Point> {
    public bool Equals(Point a, Point b) {
    return a.X == b.X;
    }p
    ublic int GetHashCode(Point obj) {
    return obj.X;
    }
    } 
     然后调用Distinct的重载方法,此时可以得到预期的结果:
     PointComparer cmp = new PointComparer();
    var query = array.Distinct(cmp); // 得到1,2  
    11.GroupBy()  
    在T-SQL中,Group By只能和聚合函数一起搭配使用,返回的结果仍然是一个表(Flat)。 但是在LINQ中,GroupBy()的结果可以是一个树形结构,即序列中的元素也是一
    个序列。  
     group  by 之后会产生一个key,key就是我们的分组ID’(item.key),之后再次循环item里面的值才是我们想要的对象:
     var query = col.GroupBy(x => x.Category);
    foreach (var item in query) {//循环每个组
    Console.WriteLine("<{0}>", item.Key);
    foreach (var p in item) {//循序每个组的全部子集
    Console.WriteLine(p.ToString());
    }
    }  
    GroupBy()还包含一个重载方法,使用投影操作将TSource映射为其他类型  :
    var query = col.GroupBy(x => x.Category,
    x => new SelectListItem { Text = x.Code + x.Name,
    Value = x.Price.ToString() }); 
    获取数据的操作跟我们之前的一样 。SelectListItem 可以是任意类型,比如匿名
    12.Intersect()和Except() 
     Intersect()返回两个序列中相同元素构成的序列。对于自定义类型来说跟PointComparer 类一样:
     int[] array1 = { 0, 1, 2 };
    int[] array2 = { 2, 3, 4 };
    var query = array1.Intersect(array2); // 得到 2  
     Except()与Intersect()相反,返回第一个序列中有而第二个序列中没有的元素:
     var query = array1.Except(array2); // 得到 0,1
     13.Concat()和Union()
    Concat()运算符用于连接两个序列。   
    Union()运算符也用于连接两个序列,但是会剔除相同的项目 
     var query = array1.Concat(array2); // 得到 0,1,2,2,3,4
     var query = array1.Union(array2); // 得到 0,1,2,3,4
    5.4.2 返回其他序列类型  
     ToArray()、 ToList()、 ToDictionary()、 ToLookUp()四个方法用于将IEnumerable<T>转换为相应的类型。 在转换时,会执行遍历,因此这几个方法都是立即执行的,没有进行延时加载。  
     5.4.3 返回序列中元素
     1.ElementAt()和ElementAtOrDefault()
     ElementAt()以序列中元素的位置作为参数,返回该元素。 如果元素不存在,则抛出异常。   
    ElementAtOrDefault()在元素不存在时返回该类型的默认值。 对于引用类型来说,其默
    认值为null。  int类型为0,因为是返回默认值,所以不会抛出异常
     2.First()和FirstOrDefault()
    First()和Where()类似,只不过First()返回满足条件的第一个序列元素,而Where()返回
    所有满足条件的序列元素。 当元素不存在时,First()会抛出异常,而FirstOrDefault()返回元素的默认值(没有返回null)
    int[] array = { 1, 2, 3, 4 };
    int item = array.First(x => x %2 == 0); // 得到 2
    int item2 = array.First( x => x==10); // 异常:序列不包含任何匹配元素
    int item3 = array.FirstOrDefault(x=>x==10); // 得到 0  
     当不传递参数时,First()返回序列中的首个元素:
     int item = array.First(); // 得到1
     3.Last()和LastOrDefault()  跟上面的相反
     4.Single()和SingleOrDefault()
     Single()与First()类似,只不过Single()要求序列中有且只有一个满足条件的项,如果满足条件的有两项,则会抛出异常。 SingleOrDefault()要求有一个或零个满足条件的项,当满
    足条件的项为零个时,返回默认值:  
    int[] array = { 1, 2, 2, 3 };
    int item2 = array.Single(x => x == 2); // 异常:序列中包含一个以上的元素
    int item3 = array.SingleOrDefault(x => x == 10); // 得到0  
     Single()还有一个不包含任何查询条件的重载,当序列中有且仅有一个元素时,返回该元素,否则抛出异常:  
     int[] array = { 1 };
    int item = array.Single(); // 得到 1
    int[] array2 = { 1, 2 };
    int item2 = array2.Single(); // 抛出异常:序列中包含一个以上的元素  
    5.4.4 返回标量值  
    1.Count()和LongCount()  
    这两个方法用于返回序列中的元素数目,不同的是Count()返回int类型,而LongCount()返回long类型。 
    2.Max()、 Min()、 Average()和Sum()
    从名称就可以看出这几个方法的用意,Max()返回序列中最大的项,Min()返回序列中最
    小的项,Average()返回序列中各项的平均值,Sum()返回序列中各项的总和: 
     3.Aggregate()
    Aggregate()运算符用于返回自定义的聚合,例如,可以将序列中每个元素乘以2,再将
    它们相加起来:  
     int[] array = { 2, 3, 5 };
    int sum = array.Aggregate(0, (total, x) => total + (x * 2));
    Console.WriteLine(sum)  
    上面的0是total的初始值,total是运算后的结果,Lambda表达式为运算的方法,上面
    的代码相当于:  
    int[] array = { 2, 3, 5 };
    int total = 0;
    foreach (int x in array) {
    total = total + (x * 2);
    }i
    nt sum = total;
    Console.WriteLine(sum); 
     4.Contains()、 Any()、 All()和SequenceEqual()
    这4个方法都返回bool类型,用作条件判断 :
     Contains()判断某一个元素是否存在于序列中
    Any()判断序列中是否存在满足表达式的元素,只要有一个元素满足,则返回True。 当
    调用无参数的重载方法时,Any()用于判断序列中是否包含元素。  
    All()判断序列中所有的元素是否都满足表达式,只要有一个元素不满足,则返回False。  
    SequenceEqual(),用于逐项比较两个序列,当两个序列中的元素数目相同,并且序列
    中相同位置的元素也相同时,返回True,否则返回False:  
    int[] array = { 0, 1, 2 };
    int[] array2 = { 0, 1, 2, 3 };
    int[] array3 = { 0, 1, 2 };
    var query = array.SequenceEqual(array2); // False
    var query2 = array.SequenceEqual(array3); // True 
     5.4.5 其他方法
     还有一些方法,它们也定义在System.Linq.Enumerable类中,却不是扩展方法,只是普通的静态方法,因此,只能在Enumerable类上调用。  
     Empty()用于创建一个空的序列,由泛型参数指定序列的元素类型:
    IEnumerable<string> list1 = Enumerable.Empty<string>(); //创建一个空的string序列
    IEnumerable<int> list2 = Enumerable.Empty<int>(); //创建一个空的int序列
    Console.WriteLine(list1.Count()); // 0
    list1的实际类型可以通过调用GetType().FullName来获得:
    Console.WriteLine(list1.GetType().FullName); // System.String[]
    Range()方法只能用于int类型,用于生成由连续数字构成的序列,序列中的元素依次加
    1:
    IEnumerable<int> seq = Enumerable.Range(0, 3); // 0,1,2,常跟select用于代替循环的操作
    Repeat()方法与Range()类似,只不过用于生成重复的数字:
    IEnumerable<int> seq = Enumerable.Repeat(0, 3); // 0,0,0  
    

      

  • 相关阅读:
    箭头函数和普通函数的this指向问题
    npm源切换
    移动端穿透问题
    let作用域问题
    react服务端渲染(十一)引入样式&&一些优化
    react服务端渲染(十)404&&301页面实现
    react服务端渲染(八)路由改写
    react服务端渲染(九)proxy代理&&多级路由&&数据的脱水和注水
    react-router 使用
    2017.11.01 ExecuteNonQuery、ExecuteScalar、ExecuteDataSet、FillDataSet 流程
  • 原文地址:https://www.cnblogs.com/entclark/p/7901168.html
Copyright © 2011-2022 走看看