Mux和;使用/ LINQ进行解复用

时间:2010-03-06 14:24:17

标签: linq linq-to-objects multiplexing mux

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

请参阅此解复用程序签名:

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

在抽象层面上,这很容易,但最理想的是

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

你会怎么做?

我有点累,所以我的注意力可能会让我失望......

1 个答案:

答案 0 :(得分: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对象的其余部分,不可否认 - 懒惰的预测等将成为过去。

请注意,这与GroupBy之类的操作非常类似 - 它们是延迟的,但不是延迟的:只要您从GroupBy结果开始阅读,它就会读取整个输入数据。