-
过滤数据
Where()
根据条件产生相应的IEnumerable<T>
集合。它有像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<int>();
-
限定符运算(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<Record> {
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<TSource> (this System.Collections.Generic.IEnumerable<TSource> source, TSource value, System.Collections.Generic.IEqualityComparer<TSource> comparer);
- 集合操作
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<TSource>
类型的参数,即可以重写默认的比较方法,像Contains
一样 - 连接操作
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<TSource> OrderBy<TSource, TKey>(this IEnumerable<TSource> source, Func<TSource, TKey> 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<Record> {
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
调用多次,不能达到ThenBy
,ThenByDescending
的效果。collections 中原有的Sort
和Reverse
会改变原来数据的顺序,而以上函数不会。
以上是学习edx中的Data Querying Using LINQ and C#课程的笔记