(я предполагаю, что это для 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;
}
}
Я разделил это на два метода, так что проверка аргументов может быть выполнена с нетерпением, но я все еще могу использовать блок итератора. (Никакой код в блоке итератора не выполняется до первого вызова MoveNext()
результата.)