linq - Mux 和 Demux with/L​​INQ

标签 linq linq-to-objects multiplexing

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

查看这个多路分解器签名:

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

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

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

你会怎么做?

我有点累,可能是我注意力不集中...

最佳答案

假设您希望 (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结果,它读取整个输入数据。

关于linq - Mux 和 Demux with/L​​INQ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2392749/

相关文章:

c# - 在 linq 查询中过滤选定的枚举

c - io多路复用,server收不到数据

c - 什么是文件描述符的 "exception"?

c# - 从对象列表中获取 n 个(部分)对象,从 n 个索引开始

c# - 不能使用 lambda 表达式作为动态调度操作的参数

c# - 检查对象列表中数字一致性的方法

python - queue.Queue 上的多路复用?

C# EF 从一个表中查找数据的最佳方法

c# - 将两个 LINQ 语句合并为一个

c# - 您可以在选择项目之前在 linq 查询中设置属性吗?