5

假设我有两个(或更多)IEnumerable<T>有很多元素。每一个IEnumerable都有另一种类型T。列表可能非常长,不应完全加载到内存中。

IEnumerable<int> ints = getManyInts();
IEnumerable<string> strings = getSomeStrings();
IEnumerable<DateTime> dates = getSomeDates();

我想要做的是遍历这些列表,并为每个步骤获取一个包含一个 int、一个字符串和一个 DateTime 的项目,直到到达最长或最短列表的末尾。两种情况都应该支持(布尔参数最长与最短)。对于较短列表中不可用的每个项目(因为已经到达末尾),我希望使用默认值。

for(Tuple<int,string,DateTime> item in 
    Foo.Combine<int,string,DateTime>(ints, strings, dates))
{
    int i=item.Item1;
    string s=item.Item2;
    DateTime d=item.Item3;
}

是否可以使用延迟执行的 linq 来做到这一点?我知道使用 IEnumerators 直接结合收益回报的解决方案。请参阅如何在 .NET 2 中同时迭代两个 IEnumerables

4

1 回答 1

4

这样的事情应该这样做(警告-未经测试):

public static IEnumerable<Tuple<T, U, V>> IterateAll<T, U, V>(IEnumerable<T> seq1, IEnumerable<U> seq2, IEnumerable<V> seq3)
{
    bool ContinueFlag = true;
    using (var e1 = seq1.GetEnumerator())
    using (var e2 = seq2.GetEnumerator())
    using (var e3 = seq3.GetEnumerator())
    {
        do
        {
            bool c1 = e1.MoveNext();
            bool c2 = e2.MoveNext();
            bool c3 = e3.MoveNext();
            ContinueFlag = c1 || c2 || c3;

            if (ContinueFlag)
                yield return new Tuple<T, U, V>(c1 ? e1.Current : default(T), c2 ? e2.Current : default(U), c3 ? e3.Current : default(V));
        } while (ContinueFlag);
    }
}
于 2011-02-03T16:34:34.827 回答