【发布时间】:2011-04-28 16:58:55
【问题描述】:
我有:-
IEnumerable<IEnumerable<T>> items;
我想创建:-
IEnumerable<IEnumerable<T>> results;
其中“results”中的第一项是“items”的每个 IEnumerables 的第一项的 IEnumerable,“results”中的第二项是每个“items”的第二项的 IEnumerable,等等.
IEnumerables 的长度不一定相同。如果项目中的某些 IEnumerable 在特定索引处没有元素,那么我希望结果中匹配的 IEnumerable 中的项目更少。
例如:-
items = { "1", "2", "3", "4" } , { "a", "b", "c" };
results = { "1", "a" } , { "2", "b" }, { "3", "c" }, { "4" };
编辑:另一个示例(在 cmets 中请求):-
items = { "1", "2", "3", "4" } , { "a", "b", "c" }, { "p", "q", "r", "s", "t" };
results = { "1", "a", "p" } , { "2", "b", "q" }, { "3", "c", "r" }, { "4", "s" }, { "t" };
我事先不知道有多少个序列,也不知道每个序列有多少个元素。我可能有 1,000 个序列,每个序列有 1,000,000 个元素,我可能只需要前 10 个,所以如果可以的话,我想使用源序列的(惰性)枚举。如果可以的话,我尤其不想创建新的数据结构。
是否有内置方法(类似于 IEnumerable.Zip)可以做到这一点?
还有其他方法吗?
【问题讨论】:
-
如果项目包含三个序列会怎样?
-
这类似于"How to iterate over two arrays at once?"(涵盖N = 2的情况)
-
查看 Eric Lippert 的博客(该博客从一个 SO 问题的答案扩展而来)关于在任意多个序列上计算笛卡尔积。 blogs.msdn.com/b/ericlippert/archive/2010/06/28/…
-
除了对不同长度的要求外,这听起来很像矩阵的转置。我在这里为 LINQ 写了一个 Transpose 方法:stackoverflow.com/questions/2070356/…
-
@Richard:添加了一个示例,@James:是的,但是如果您事先知道有多少个序列,这很容易 :(,@Anthony:唉,Eric 可以使用累加器,所以没有t 需要枢轴,@dtb:您的转置方法看起来是一个好的开始。