1、用Where()方法进行筛选
int[] intAry1 = { 1, 2, 3, 4, 5, 6, 7, 8, 10, 30, 33, 44, 45 }; //第一个版本的Where()只对集合中数据进行筛选 var query1 = intAry1.Where(c => c % 5 == 0); foreach (var item in query1) { Console.WriteLine("{0}", item); } //第二个版本的Where()同时对集合中的元素和索引进行筛选 var query2 = intAry1.Where((c, index) => c % 5 == 0 && c > index * 3); foreach (var item in query2) { Console.WriteLine("{0}", item); }
当判断条件非常复杂时,用简单的Lambda很难描述,则需要使用函数委托来实现,并且提供一个独立的函数表示这个条件判断
2、用OrderBy()方法进行排序
int[] intAry = { 3, -2, 5, 8, 3, 4, 2, 19, 20 }; var queru1 = intAry.OrderBy(c => c % 10); //从小到大排序 foreach (var item in queru1) { Console.WriteLine("{0}", item); } var query2 = intAry.OrderByDescending(c => c % 10);//从大到小{ foreach (var item in query2) { Console.WriteLine("0}", item); }
如果没有指定特定的比较器,将使用默认的数据比较器。示例中使用的是int类型的比较器。
以下两种情况需要使用特定的比较器:
* 默认数据比较器不能满足特殊的比较需要
*自定义的类不存在默认的数据比较器
class Program { static void Main(string[] args) { UseOrderByDef(); } static void UseOrderByDef() { MyCompare mc = new MyCompare(); int[] intAry1 = { 3, -2, 5, 8, -3, -4, 2, -19, 20 }; var query1 = intAry1.OrderBy(val => val, mc); Console.Write("query1:"); foreach (var item in query1) { Console.WriteLine("{0}", item); } } } //自定义的int类型的比较器,实现IComparer<int>接口 class MyCompare : IComparer<int> { //比较函数具体实现,对x和y的绝对值进行比较 public int Compare(int x, int y) { int x1 = Math.Abs(x); int y1 = Math.Abs(y); if (x1 > y1) return 1; else if (x1 == y1) return 0; else return -1; } }
MyComparer类实现接口IComparer<int>,它实现Compare()方法提供对int值的新的比较器,且是直接比较int的绝对值。
3、用Skip(),SkipWhile()跳过元素
SkipWhile 逐个判断,为False的时候返回集合剩下的所有元素。
备注:
Take是取出相应数量的元素,TakeWhile和SkipWhile刚好相反,前者提取出满足条件的元素,返回False时,后面的所有元素都不去判断了。后者是跳过满足条件的,知道返回False时,返回集合里剩下的所有元素
5、用Max(),Main(),Sum(),Average()等对元素进行数值计算
对于string 类型的数组,Max()和Min()方法的取值分别是单词首字母在字母表中的位置,Max就是最后,Min就是最靠前,string类型不能进行平均或者求和
如果对非数值类型的数据进行求和,求平均,求最大值,求最小值等操作,这就需要使用数值操作的从在版本,并且在重载版本中接收一个函数委托类型的参数
lambda里面,max,min,求平均和求和等,不作用于非数值类型的数据,如上,取出最大长度单词,得使用orderby等排序实现。
6、用Distinct()消除集合中相等的元素
当元素不是int等的简单类型的时候,甚至该类型根本不存在默认比较器时,需要使用distinct另外一个版本,自定义比较器,与Orderby和OrderbyDesending的另一版本使用默认版本和自定义比较器版本类似
//distinct自定义比较器 class MyStrEqualComparer : IEqualityComparer<string> { //实现Equals方法 bool IEqualityComparer<string>.Equals(string x, string y) { //如果两个字符串传入的第一个字符相等,则返回true return x.Substring(0, 1) == y.Substring(0, 1); } public int GetHashCode(string obj) { return obj.Length; //自定义将字符串的长度作为哈希码 } }
该比较器的规则是,将首字母相同,和字符串长度相同的视为重复数据,distinct自定义比较器的接口实现可以深入了解下
7、用Concat()连接两个集合
Concat()连接两个集合,元素必须是同类型的集合,否则不能做连接操作,Concat()只是将两个集合连接在一起,并不会对集合内元素做任何操作;
8、用Union()、Intersect()、Except()等进行集合操作
这三者分别是集合的交集,并集和差集操作,这三个方法各自都包含两个重载的版本。
static void UseUnionIntersectExcept() { //并集,交集,差集 int [] Ary1 = { 1, 2, 4, 5, 7, 12, 34, 56 }; int[] Ary2 = { 23, 45, 12, 2, 4, 6, 7, 8 }; //Union var query = Ary1.Union(Ary2); Console.WriteLine("并集:"); foreach (var item in query) { Console.Write("{0},", item); } Console.WriteLine(""); //Intersect var query1 = Ary1.Intersect(Ary2); Console.WriteLine("交集:"); foreach (var item in query1) { Console.Write("{0},",item); } Console.WriteLine(""); //Except Console.WriteLine("差集A差B:"); var query2 = Ary1.Except(Ary2); foreach (var item in query2) { Console.Write("{0},", item); //a Except b } Console.WriteLine(""); Console.WriteLine("差集B差A:"); var query3 = Ary2.Except(Ary1); foreach (var item in query3) { Console.Write("{0},", item); } }
简单的交并差集操作,值得注意的是,差集A差B和B差A,输出结果是不同的,前者是返回 A有B没有的元素,后者是返回B有A没有的元素
自定义比较器,参见前面,此处不再赘述