Lambda 表达式常用函数

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的时候返回集合剩下的所有元素。

备注:

 

 SkipWhile也对数据源进行枚举,从第一个枚举得到的元素开始,调用客户端的predicate,如果返回true,则跳过该元素,继续进行枚举操作.但是,如果一旦predicate返回为false,则该元素以后的所有元素,都不会再调用predicate,而全部枚举给客户端 
 
4、用Take()、TakeWhile()提取元素
 

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没有的元素

自定义比较器,参见前面,此处不再赘述

转载于:https://www.cnblogs.com/wangcongsuibi/p/8780644.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值