.net之Linq学习笔记(一)

  1. 过滤数据
    Where()
    根据条件产生相应的IEnumerable集合。它有像sql一样的表达方式
    用法:Where(c=> c.val>0)
    var result = from c1 in collection1 where c1.val>1 && c1.val < 2 select c1
    OfType
    可以获取特殊子类型的数据
    用法:var objects = new Object[] { 1, 10L, 1.1, 1.1f, "Hello", 2, 3 }; var result = objects.OfType();

  2. 限定符运算(Quantifier Operations)
    All()
    当有一项元素不满足条件时返回false
    用法:val.All(c=>c.Field > 0)
    Any()
    当有一项元素满足条件时返回true
    用法:val.Any(c=>c.Field>0)
    Contains()
    判断是否含有这个值
    用法:int[] integers = { 100, 200, 300, 400, 500 };
    var result1 = integers.Contains(200);//返回true var result2= integers.Contains(200,new RecordComparer());
    需要注意Contains比较对象是否相等, 若是传入的自定义类,要想值相等返回true必须实现其Comparer接口,重写Equals,如下

class RecordComparer : IEqualityComparer {
    public bool Equals(class x, class y) {
        return x.Val == y.Val;
    }
    public int GetHashCode(Record obj) {
        return obj.GetHashCode();
    }
}

因为Contains的定义如下

public static bool Contains (this System.Collections.Generic.IEnumerable source, TSource value, System.Collections.Generic.IEqualityComparer comparer);
  1. 集合操作
    Distinct()
    使集合只有不同的元素,移除相同的元素
    用法:int[] left = { 1, 1, 2, 2, 3, 3, 4 };
    var distinctResult = left.Distinct();//结果:1,2,3,4
    Intersect()
    获得两个集合的交集
    用法:col1.Intersect(col2);//col1和col2同一类型
    Except()
    获得在A集合中不在B集合中的元素的集合
    用法:A.Except(B);//A和B同一类型
    Union()
    获得两个集合的并集,去掉重复的元素
    用法:A.Union(B);//A和B同一类型
    以上四个操作函数都可以接受IEqualityComparer 类型的参数,即可以重写默认的比较方法,像Contains一样
  2. 连接操作
    Concat()
    将两个集合简单地连接起来,即在A后面接上B,且不会去除重复的元素
    用法:
    int[] A = { 1, 2, 3}; int[] b = { 3, 2, 1}; var result = A.Concat(B); // 1,2,3,3,2,1
    5. 排序操作
    OrderBy
    根据相应的字段进行顺序(从小到大)排序
    public static IOrderedEnumerable OrderBy(this IEnumerable source, Func keySelector);
    用法: records.OrderBy(r => r.Name)
    var sortedByRank = from r in records orderby r.Rank select r;
    ThenBy
    根据相应的字段 进行二次排序
    用法:var sortedByRank = records.OrderBy(r => r.Rank).OrderBy(r => r.Name);
    var sortedByRank = from r in records orderby r.Rank, r.Name select r;
    OrderByDescending
    根据相应字段进行逆序排序
    用法:records.OrderByDescending(r => r.Name)
    var sortedByRank = from r in records orderby r.Rank descending select r;
    ThenByDescending
    根据相应的字段 进行二次逆序排序
    用法:
var sortedByRank = records.OrderBy(r=>r.Rank).ThenByDescending(r=>r.Name);
var sortedByRank = from r in records orderby r.Rank, r.Name descending select r;

Reverse
形成一个跟原来排序相反的集合
用法:var reversed = original.Reverse();
自定义排序比较:

class RecordComparer : IComparer {
    public int Compare(Record x, Record y) {
        if (x.Rank < y.Rank) {
            return -1;
        } else if (x.Rank > y.Rank) {
            return 1;
        }

        if (x.Gender < y.Gender) {
            return -1;
        } else if (x.Gender > y.Gender) {
            return 1;
        }
        return String.Compare(x.Name, y.Name);
    }
}

var sorted = records.OrderBy(r => r, new RecordComparer());
注意:调用OrderBy,OrderByDescending调用多次,不能达到ThenByThenByDescending的效果。collections 中原有的SortReverse会改变原来数据的顺序,而以上函数不会。


以上是学习edx中的Data Querying Using LINQ and C#课程的笔记

你可能感兴趣的:(Linq)