zoukankan      html  css  js  c++  java
  • 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没有的元素

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

  • 相关阅读:
    感知器算法--python实现
    PHP appserv + ZendStudio12.5.1 + 注册码
    第九周-每周例行报告
    第八周-每周例行报告
    感谢THUNDER
    第七周-每周例行报告
    第六周-每周例行报告
    第五周-每周例行报告
    第四周-四则运算试题生成
    第四周-单元测试
  • 原文地址:https://www.cnblogs.com/wangcongsuibi/p/8780644.html
Copyright © 2011-2022 走看看