美文网首页
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