首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Mux & Demux w/ LINQ

Mux & Demux w/ LINQ
EN

Stack Overflow用户
提问于 2010-03-06 14:24:16
回答 1查看 344关注 0票数 3

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

请参见此演示者签名:

代码语言:javascript
复制
public static IEnumerable<IEnumerable<TSource>> Demux<TSource>(this IEnumerable<TSource> source, int multiplexity)

在抽象的层次上,这很容易,但理想的情况是

  • 仍然懒惰于源流
  • 对于每个复用流
  • 不对相同的元素

进行重复

你会怎么做?

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

EN

回答 1

Stack Overflow用户

发布于 2010-03-06 14:34:55

假设您希望(0,1,2,3)在分解到两个流时以(0,2)和(1,3)结尾,那么您基本上不能不缓冲就完成它。只有在必要时才能缓冲,但这很困难。基本上,你需要能够处理两种矛盾的使用电话的方式.

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

代码语言:javascript
复制
// 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

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

代码语言:javascript
复制
// 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结果开始读取,它就会读取整个输入数据。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2392749

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档