我有:-
IEnumerable<IEnumerable<T>> items;
Run Code Online (Sandbox Code Playgroud)
我想创造: -
IEnumerable<IEnumerable<T>> results;
Run Code Online (Sandbox Code Playgroud)
其中"结果"中的第一项是"项目"的每个IEnumebles的第一项的IEnumerable,"结果"中的第二项是每个"项目"的第二项的IEnumerable等.
IEnumerables不一定是相同的长度.如果项目中的某些IEnumerables在特定索引中没有元素,那么我希望结果中匹配的IEnumerable中包含更少的项目.
例如:-
items = { "1", "2", "3", "4" } , { "a", "b", "c" };
results = { "1", "a" } , { "2", "b" }, { "3", "c" }, { "4" };
Run Code Online (Sandbox Code Playgroud)
编辑:另一个例子(评论中要求): -
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" };
Run Code Online (Sandbox Code Playgroud)
我事先并不知道有多少序列,也没有每个序列中有多少元素.我可能有1,000个序列,每个元素包含1,000,000个元素,我可能只需要第一个~10个,所以如果可以的话,我想使用源序列的(惰性)枚举.特别是如果我能帮助它,我不想创建新的数据结构.
是否有内置方法(类似于IEnumerable.Zip)可以做到这一点?
还有另外一种方法吗?
现在经过轻微测试并具有工作处理能力.
public static class Extensions
{
public static IEnumerable<IEnumerable<T>> JaggedPivot<T>(
this IEnumerable<IEnumerable<T>> source)
{
List<IEnumerator<T>> originalEnumerators = source
.Select(x => x.GetEnumerator())
.ToList();
try
{
List<IEnumerator<T>> enumerators = originalEnumerators
.Where(x => x.MoveNext()).ToList();
while (enumerators.Any())
{
List<T> result = enumerators.Select(x => x.Current).ToList();
yield return result;
enumerators = enumerators.Where(x => x.MoveNext()).ToList();
}
}
finally
{
originalEnumerators.ForEach(x => x.Dispose());
}
}
}
public class TestExtensions
{
public void Test1()
{
IEnumerable<IEnumerable<int>> myInts = new List<IEnumerable<int>>()
{
Enumerable.Range(1, 20).ToList(),
Enumerable.Range(21, 5).ToList(),
Enumerable.Range(26, 15).ToList()
};
foreach(IEnumerable<int> x in myInts.JaggedPivot().Take(10))
{
foreach(int i in x)
{
Console.Write("{0} ", i);
}
Console.WriteLine();
}
}
}
Run Code Online (Sandbox Code Playgroud)