【发布时间】:2010-09-14 21:33:23
【问题描述】:
我很难找到用于以下迭代器块的正确 LINQ 语法:
class Program
{
class Operation
{
public IEnumerable<Operation> NextOperations { get; private set; }
}
class Item { }
static Item GetItem(Operation operation)
{
return new Item();
}
static IEnumerable<Item> GetItems(IEnumerable<Operation> operations)
{
foreach (var operation in operations)
{
yield return GetItem(operation);
foreach (var item in GetItems(operation.NextOperations)) // recursive
yield return item;
}
}
static void Main(string[] args)
{
var operations = new List<Operation>();
foreach (var item in GetItems(operations))
{
}
}
}
也许我所拥有的和它一样好?对于这个特定的代码,在显式 foreach 中的 yield return 确实是正确的解决方案?
【问题讨论】:
-
有更好的方式将序列压缩在一起,但我不确定它们是否是一种改进。
-
这并不是正常意义上的压缩。它更像是一棵树的遍历。
-
@recursive:我认为你是对的,但我也认为这可以被视为作为一个奇怪的、特殊的压缩情况。不过,并不是说应该。
-
请注意,这个递归解决方案在时间上是 O(nh),其中 h 是树的高度;由于树的高度介于 lg n 和 n 之间,因此介于 O(n lg n) 和 O(n^2) 之间。如果树很深,这可能会产生非常糟糕的性能。如果您编写一个具有显式堆栈管理的非递归解决方案,那么它在时间上变为 O(n),在空间上变为 O(h)。
标签: c# linq iterator yield-return