C# · 12月 28, 2021

c# – 您将如何使用SelectMany实现LINQ方法?

Erik Meijer is fond of pointing out that every LINQ function Could actually be implemented by SelectMany; everything else is just a convenience.

这是Eric Lippert says answering a question about monads,但我听说Erik Meijer在其他关于LINQ和Rx的视频中说了这个. (简而言之,Erik Meijer是创建LINQ和Rx的人)

我想知道如何使用SelectMany实现一些最常用的LINQ功能?
现在忽略自我,让我们专注于优雅和简洁.

>哪里
>选择
>首先
拿(n)
> TakeWhile
> GroupBy
> OrderBy
>邮编
>其他…

解决方法 要记住的主要方面是SelectMany可以在IEnumerable上运行,并使用能够访问当前项目及其索引的lambda表达式返回一个IEnumerable.所以你可以做的任何事情都可以通过访问当前项或其索引来转换结果:

>决定要保留或丢弃的元素(Where,First,Take,Skip,TakeWhile)
>更改元素并返回新元素(选择)
>做其他的东西? (GroupBy,老实说,不知道如何实现,没有一些想法)

这个简单的例子可以清楚地看出,这些可以很容易地实现:

SomeList.SelectMany(x => ShouldBeIncluded(x) ? Enumerable.Repeat(x,1) : Enumerable.Empty<AClass>(); );

编辑 – Tim Schmelter发表的很棒的link在评论中再次证明,Jon Skeet已经做得很清洁了:

return Enumerable.Repeat(x,ShouldBeIncluded(x) ? 1 : 0;