3

我正在尝试使用 LINQ to Objects 进行多路复用和多路分解,但在我看来这是一个非常棘手的问题。

请参阅此解复用器签名:

public static IEnumerable<IEnumerable<TSource>> Demux<TSource>(this IEnumerable<TSource> source, int multiplexity)

在抽象层面上,这很容易,但理想情况下,人们会想要

  • 对源流保持懒惰
  • 对每个多路复用流保持惰性
  • 不要重复相同的元素

你会怎么做?

我有点累,所以可能是我的注意力不集中在这里...

4

1 回答 1

2

假设您希望 (0, 1, 2, 3) 在解复用到两个流时以 (0, 2) 和 (1, 3) 结束,那么如果没有缓冲,您基本上无法做到。您只能在必要时缓冲,但这会很困难。基本上,您需要能够应对两种相互矛盾的调用方式......

获取两个迭代器,并从每个迭代器中读取一个项目:

// Ignoring disposing of iterators etc
var query = source.Demux(2);
var demuxIterator = query.GetEnumerator();
demuxIterator.MoveNext();
var first = demuxIterator.Current;
demuxIterator.MoveNext();
var second = demuxIterator.Current;
first.MoveNext();
Console.WriteLine(first.Current); // Prints 0
second.MoveNext();
Console.WriteLine(second.Current); // Prints 1

或者获取一个迭代器,然后读取两个项目:

// Ignoring disposing of iterators etc
var query = source.Demux(2);
var demuxIterator = query.GetEnumerator();
demuxIterator.MoveNext();
var first = demuxIterator.Current;
first.MoveNext();
Console.WriteLine(first.Current); // Prints 0
first.MoveNext();
Console.WriteLine(first.Current); // Prints 2

在第二种情况下,它必须要么记住 1,要么能够重读它。

任何机会你可以处理IList<T>而不是IEnumerable<T>?诚然,这将“破坏” LINQ to Objects 的其余部分 - 懒惰的投影等将成为过去。

请注意,这与类似操作的问题非常相似GroupBy——它们是延迟的,但不是懒惰的:一旦您开始从GroupBy结果中读取,它就会读取整个输入数据。

于 2010-03-06T14:34:55.407 回答