【发布时间】:2009-11-22 16:06:05
【问题描述】:
假设我有一个序列。
IEnumerable<int> sequence = GetSequenceFromExpensiveSource();
// sequence now contains: 0,1,2,3,...,999999,1000000
获取序列并不便宜,而且是动态生成的,我只想迭代一次。
我想得到 0 - 999999(即除最后一个元素之外的所有元素)
我知道我可以这样做:
sequence.Take(sequence.Count() - 1);
但这会导致对大序列进行两次枚举。
是否有一个 LINQ 结构可以让我这样做:
sequence.TakeAllButTheLastElement();
【问题讨论】:
-
您必须在 O(2n) 时间或 O(count) 空间效率算法之间进行选择,后者还需要在内部数组中移动项目。
-
达里奥,请你为那些不太喜欢大 o-notation 的人解释一下吗?
-
另请参阅此重复问题:stackoverflow.com/q/4166493/240733
-
我最终通过将集合转换为列表然后调用
sequenceList.RemoveAt(sequence.Count - 1);来缓存它。就我而言,这是可以接受的,因为在所有 LINQ 操作之后,我必须将其转换为数组或IReadOnlyCollection。我想知道您甚至不考虑缓存的用例是什么?正如我所看到的,即使是批准的答案也会进行一些缓存,因此在我看来,简单地转换为List会更容易、更短。