【发布时间】:2012-04-05 21:08:51
【问题描述】:
在 LINQ 中,Where 是一个流式操作符。其中OrderByDescending 是一个非流式操作符。 AFAIK,流媒体运营商只收集下一个必要的项目。非流式操作符一次评估整个数据流。
我看不到定义 Streaming Operator 的相关性。对我来说,延迟执行是多余的。以我编写自定义扩展并使用 where 运算符和 orderby 使用它的示例为例。
public static class ExtensionStuff
{
public static IEnumerable<int> Where(this IEnumerable<int> sequence, Func<int, bool> predicate)
{
foreach (int i in sequence)
{
if (predicate(i))
{
yield return i;
}
}
}
}
public static void Main()
{
TestLinq3();
}
private static void TestLinq3()
{
int[] items = { 1, 2, 3,4 };
var selected = items.Where(i => i < 3)
.OrderByDescending(i => i);
Write(selected);
}
private static void Write(IEnumerable<int> selected)
{
foreach(var i in selected)
Console.WriteLine(i);
}
在任何一种情况下,Where 都需要评估每个元素以确定哪些元素满足条件。它产生的事实似乎只是因为操作员获得了延迟执行而变得相关。
那么,Streaming Operators 的重要性是什么?
【问题讨论】:
-
在
items中使用大约 20 亿个整数再试一次。 -
@cHao 或无限序列,或从开放网络流派生的序列。
-
在某些情况下,Linq 无法延迟执行。某些操作需要 slurping IEnumerable。不是 Where(),一次一个。但肯定是 OrderBy,除非您知道 所有 集合项,否则无法对集合进行排序。我最喜欢的是 Enumerable.Reverse() ,它打破了 IEnumerable 规则。在 IList 上使用 O(n) 存储和 O(n) 执行进行了令人震惊的未优化。马虎。