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

luk*_*ler 15 c# linq functional-programming system.reactive

Erik Meijer喜欢指出每个LINQ函数实际上都可以由SelectMany实现; 其他一切都只是一种便利.

这就是Eric Lippert在回答有关monad的问题时所说的,但我听说Erik Meijer在其他关于LINQ和Rx的视频中这样说.(简单地说,Erik Meijer是创建LINQ和Rx的人)

我想知道如何用SelectMany实现一些最常用的LINQ函数? 暂时忽略性能,让我们专注于优雅和简洁.

  • 哪里
  • 选择
  • 第一
  • 以(N)
  • TakeWhile
  • 通过...分组
  • 排序依据
  • 压缩
  • 其他...

Oce*_*t20 2

要记住的主要一点是,使用可以访问当前项及其索引的 lambda 表达式来处理SelectManyanIEnumerable并返回 an 。IEnumerable因此,您可以通过访问当前项目或其索引来转换结果:

  • 决定保留或丢弃哪些元素 ( Where, First, Take, Skip, TakeWhile)
  • 更改元素并返回新元素 ( Select)
  • 做其他事吗?(GroupBy,老实说,我不知道如何不加思考地实现它)

这个简单的Where例子将清楚地表明其中有多少可以轻松完成:

SomeList.SelectMany(x =>
    ShouldBeIncluded(x) ?
        Enumerable.Repeat(x, 1) :
        Enumerable.Empty<AClass>();
    );
Run Code Online (Sandbox Code Playgroud)

编辑 - 蒂姆·施梅尔特在评论中发布的精彩链接再次证明乔恩·斯基特已经做得更干净了:

return Enumerable.Repeat(x, ShouldBeIncluded(x) ? 1 : 0;
Run Code Online (Sandbox Code Playgroud)