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

c# 从MoreLinq中学到的(二)

作者: wwmin_ | 来源:发表于2021-02-19 17:49 被阅读0次

前言

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

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

1. 数字指定小数位数/有效位数/取整整数不足补零

//数字指定小数位数/有效位数/取整整数不足补零
void ToStringWithFixedNum()
{
    var f = 12.123456;
    f.ToString("F3").Dump();//12.123
    f.ToString("G3").Dump();//12.1
    f.ToString("000", CultureInfo.InvariantCulture).Dump();//012
     //字符串复合格式设置
    String.Format("0x{0:X} {0:E} {0:N}",Int64.MaxValue);
    //0x7FFFFFFFFFFFFFFF 9.223372E+018 9,223,372,036,854,775,807.00
}

对数字进行展示时经常会有特殊处理,特别是小数,所以使用一些ToString的方法会很方便。CultureInfo是对地域的选择,更多信息可查看官方解释CultureInfo 类。若有更多格式设置,可查看符合格式设置,以便满足更多个性化ToString设置。

2. 两个可遍历集合的复合操作

比较常用的是求和

void AggregateLambda()
{
    var i = Enumerable.Range(0, 26);
    var a = Enumerable.Range(0, 26).Select(a => (char)('a' + a));
    var zipAggregate = i.Zip(a, (us, them) => (Us: us, Them: them)).Aggregate(0, (x, y) => x + y.Us);
    zipAggregate.Dump();//325
}

此案例展示了Linq的Zip用法,而且返回了一个命名的ValueTuple,对ValueTuple的灵活使用可简化代码,并减少对对象的依赖,使用Aggregate将两个数组进行转换操作。

3. is type pattern

void IsTypeExpression()
{
    ArrayList al = new ArrayList() { 0, 1, 'a', "b" };
    StringBuilder res = new StringBuilder();
    foreach (var a in al)
    {
        if (a is { } ai and not string and not char and not 0)
        {
            res.Append("\t");
            res.Append(a);
        }
    }
    res.ToString().Trim().Dump();//1
}

is not 模式是在c#9 版本中引入的,可简化对对象的判断,使书写更语义化。

4. OfType<T>

void OfTypeFunc()
{
    ArrayList al = new ArrayList() { 0, 1, 'a', "b" };
    var ai = al.OfType<int>();
    ai.Aggregate((x, y) => x + y).Dump("OfType");//1
}

使用OfType<T>对ArrayList进行类型过滤。

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

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

相关文章

网友评论

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

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