Jon*_*eet 9

(我假设这是LINQ to Objects.其他任何东西都会以不同的方式实现:)

它只是从第一个返回所有内容,然后从第二个返回所有内容.所有数据都是流式传输的.像这样的东西:

public static IEnumerable<T> Concat(this IEnumerable<T> source1,
    IEnumerable<T> source2)
{
    if (source1 == null)
    {
        throw new ArgumentNullException("source1");
    }
    if (source2 == null)
    {
        throw new ArgumentNullException("source1");
    }
    return ConcatImpl(source1, source2);
}


private static IEnumerable<T> ConcatImpl(this IEnumerable<T> source1,
    IEnumerable<T> source2)
{
    foreach (T item in source1)
    {
        yield return item;
    }
    foreach (T item in source2)
    {
        yield return item;
    }
}
Run Code Online (Sandbox Code Playgroud)

我已经将它拆分为两个方法,以便可以急切地执行参数验证,但我仍然可以使用迭代器块.(在第一次调用MoveNext()结果之前,迭代器块中的代码不会执行.)

  • @Steven:在创建LINQ表达式时调用Concat(因为`return`).在评估LINQ表达式时调用ConcatImpl(因为`yield return`).@Jon:我很喜欢,但男孩,你快.也许我只会在你的时间凌晨3点回答.:) (4认同)
  • 请注意,这会影响性能; Concat的幼稚实现并未针对连接组合的情况进行优化.请参阅http://blogs.msdn.com/wesdyer/archive/2007/03/23/all-about-iterators.aspx,以分析天真组合的连接的性能. (4认同)
  • @Eric:无论我走到哪里,我都想拥有自己的时区......唯一的时间就是咖啡时间. (2认同)