美文网首页
c# 从MoreLinq中学到的(一)

c# 从MoreLinq中学到的(一)

作者: wwmin_ | 来源:发表于2021-02-18 21:59 被阅读0次

    前言

    在对MoreLinq库梳理的过程中学习到的一些知识点的整理。

    morelinq是对Linq to object的有力补充,国外有本书《Thinking in LINQ》专门花了一章的篇幅介绍了它,它的开发者也是《C# in Depth》作者。

    1. 获取26个字母表

    //获取26个字母表
    void GetAlphabets()
    {
        var alphabets = Enumerable.Range(0, 26).Select(i => (char)('a' + i));
        //alphabets.Dump();
        //在Javascript中可使用如下方法
        //Array(26).fill (0).map((p,i)=> String.fromCharCode('a'.charCodeAt(0)+i))
        //const 和 readonly 的区别,readonly允许在构造器中改变它的状态(初始化),而const不行
    }
    

    首先遍历一个0-25的数字集合,然后用'a'+i 得到字母的charCode, 'a' = 97, 注意代码中字符与整形相加时有个隐式转换,实际为(int)'a'+i

    2. 返回函数的函数

    //返回函数的函数
    void ReturnFuncOfFunc()
    {
        DelegateType affine1 = MakeAffine(1, 2);
        DelegateType affine2 = MA(1, 3);
        affine1(5).Dump();//1*5+2==7
        affine2(5).Dump();//1*5+3==8
    }
    
    //返回函数的函数的定义
    delegate int DelegateType(int x);
    static DelegateType MakeAffine(int a, int b)
    {
        return delegate (int x)
        {
            return a * x + b;
        };
    }
    //返回函数的函数的定义 语法糖形式
    static DelegateType MA(int a, int b) => (int x) => a * x + b;
    

    如果需要个根据不同输入返回不同函数的函数,则需要先定义一个这样一个委托类型,以便定义函数返回这个类型,注意返回函数的函数的定义语法糖形式确实很简洁,很实用。

    3. 不可变集合ImmutableList

    //ImmutableList 不可变集合 , 与string类似, string也属于Immutable,但是有些许区别
    void ImmutableListFunc()
    {
        ImmutableList<string> emptyBusket = ImmutableList.Create<string>();
        var fruitBasket = emptyBusket.Add("apple");
        //每次修改都会创建一个新的集合
        //这就意味着要开辟新的内存,并且存在数据拷贝。程序本身的执行效率会下降同时GC压力会增大。
        emptyBusket.Dump();//empty
        fruitBasket.Dump();//["apple"]
            ReferenceEquals(emptyBusket,fruitBasket).Dump();//false
    }
    

    ImmutableList 不可变集合 , 与string类似, string也属于Immutable,但是有些许区别。不可变集合最好理解的形式就是值类型,值类型都是不可变类型,对值类型变量的修改都会产生一个新的变量。

    4. 两个可遍历对象各自对应值的操作 - zip

    //两个可遍历对象各自对应值操作
    void ZipLambda()
    {
        var i = Enumerable.Range(0, 26);
        var a = Enumerable.Range(0, 26).Select(a => (char)('a' + a));
        var zip = i.Zip(a, (us, them) => (Us: us, Them: them));
        string.Join("\t", zip.Select(z => z.Us + ":" + z.Them)).Dump("Zip");
    //0:a  1:b  2:c  3:d  4:e  5:f  6:g  7:h  8:i  9:j  10:k  11:l  12:m  13:n  14:o  15:p  16:q  17:r  18:s  19:t  20:u  21:v  22:w  23:x  24:y  25:z
    }
    

    Zip是linq中提供的遍历两个可遍历对象的数据,并顺序将两个对应的值使用Action委托操作。注意如果,如果两个可遍历对象的数量不同,则取较短的那个。

    系列文章,敬请期待后续。

    本文作者:wwmin
    微信公众号: DotNet技术说
    本文链接:https://www.jianshu.com/p/1765bfee99bf
    关于博主:评论和私信会在第一时间回复。或者[直接私信]我。
    版权声明:转载请注明出处!
    声援博主:如果您觉得文章对您有帮助,关注点赞, 您的鼓励是博主的最大动力!

    相关文章

      网友评论

          本文标题:c# 从MoreLinq中学到的(一)

          本文链接:https://www.haomeiwen.com/subject/qxgnxltx.html