压缩N IEnumerable <T>一起?同时迭代它们?

Iai*_*way 7 .net c# linq

我有:-

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)可以做到这一点?

还有另外一种方法吗?

Amy*_*y B 7

现在经过轻微测试并具有工作处理能力.

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)

  • 请注意,您不会丢弃任何迭代器,这可能会很糟糕,具体取决于它们迭代的内容. (3认同)