gpt4 book ai didi

c# - 将 N 个 IEnumerable 压缩在一起?同时迭代它们?

转载 作者:太空狗 更新时间:2023-10-29 20:06:12 26 4
gpt4 key购买 nike

我有:-

IEnumerable<IEnumerable<T>> items;

我想创建:-

IEnumerable<IEnumerable<T>> results;

其中“results”中的第一项是“items”的每个 IEnumerables 的第一项的 IEnumerable,“results”中的第二项是每个“items”的第二项的 IEnumerable,等等.

IEnumerable 的长度不一定相同。如果项目中的某些 IEnumerable 在特定索引处没有元素,那么我希望结果中匹配的 IEnumerable 中包含的项目更少。

例如:-

items = { "1", "2", "3", "4" } , { "a", "b", "c" };
results = { "1", "a" } , { "2", "b" }, { "3", "c" }, { "4" };

编辑:另一个例子(在评论中要求):-

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)?

还有别的办法吗?

最佳答案

现在经过轻微测试并可以使用。

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();
}
}
}

关于c# - 将 N 个 IEnumerable<T> 压缩在一起?同时迭代它们?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3989319/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com