有几个IEnumerable<T>的实例,我想首先获得每个实例的第一个实例,然后是每个实例的第二个实例,依此类推.

如果它们是列表,我会这样做:

List<List<T>> myLists = ...;
bool iLessThanMaxSize = true;
for (int i=0; iLessThanMaxSize; i++)
{
    iLessThanMaxSize = false;
    for (int j=0; j<myLists.Count; j++)
    {
        if (i < myLists[j].Count)
        {
            iLessThanMaxSize = true;
            yield return myLists[j][i];
        }
    }
}

然而,它们不是列表,而是IEnumerables,这是必不可少的,因为这些项是在繁重的计算中按需计算的,因此一次计算所有项比按需仅获得有限数量的项要花费更长的时间.

我如何才能获得相同的行为,但使用IEnumerable<T>而不是List<T>


Edit:simultaneously,我指的不是多线程,而是枚举模式,它获取每个集合的第一个,然后是每个集合的第二个,而不是首先通过第一个集合枚举,然后通过第二个集合进行枚举,依此类推(这将连接IEumables).很抱歉给您带来了混乱.

推荐答案

如果你想用IEumable做更复杂的事情,你经常需要获得枚举数,并使用.MoveNext().Current来做事情.

例如:

public static IEnumerable<T> MyFunction<T>(IEnumerable<IEnumerable<T>> enumerables)
{
    var enumerators = enumerables.Select(e => e.GetEnumerator()).ToList();
    bool anyResult ;
    do
    {
        anyResult = false;
        foreach (var enumerator in enumerators)
        {
            if (enumerator.MoveNext())
            {
                yield return enumerator.Current;
                anyResult = true;
            }
        }
    } while (anyResult);
    foreach (var enumerator in enumerators)
    {
        enumerator.Dispose();
    }
}

[Test]
public void Test()
{
    var l1 = new[] { 1, 4 };
    var l2 = new[] { 2, 5, 6 };
    var l3 = new[] { 3, };
    var result = MyFunction(new[] { l1, l2, l3 });
    CollectionAssert.AreEqual(new []{1, 2, 3, 4, 5, 6}, result);
}

对于大量数据,我建议避免使用这样的代码.当数据量增长时,您通常希望使用较低级别、较少抽象的代码来帮助确保足够的性能.

Csharp相关问答推荐

无法将blob发送到Azure -缺少HTTP标头异常

O(N)测试失败

Entity Framework Core 8 dbcontext—无法以多对多关系添加某些行'

如何使用ConcurentDictionary属性上的属性将自定义System.Text.Json JsonConverter应用于该属性的值?

当通过Google的Gmail Api发送邮件时,签名会产生dkim = neutral(正文散列未验证)'

Polly使用泛型重试和重试包装函数

如何在NodaTime中为Instant添加一年?

在实体框架中处理通用实体&S变更跟踪器

如何使用NumberFormatInfo

C#中Java算法的类似功能

无法将生产环境的AppDbContext设置替换为用于集成测试的内存数据库

按需无缝转码单个HLS数据段

是否可以将Collectionview中的数组与ObservableCollection绑定?

同一组件的多个实例触发相同的事件处理程序

在C#中有没有办法减少大型数组中新字符串的分配?

如何在Akka.NET中重新启动执行元时清除邮箱

.NET Google Workspace API获取错误CS0266

如何从原始图像到新创建的图像获得相同的特定 colored颜色 ,并且具有相同的 colored颜色 量和相同的宽度和高度?

避免在特定区域中设置Visual Studio代码的自动格式

默认架构不存在EF核心迁移