2017-02-14 7 views
3

Включает ли Enumerable.Concat в конце первой коллекции?Включает ли Enumerable.Concat в конце первой коллекции?

Пример:

object someObject = new object(); 
List<object> listA = new List<object>(); 
listA.Add(new int()); 
object item = listA.Concat(new object[] { (object)new float() }).FirstOrDefault(); 

ли он гарантировал, что item будет int не float после Concat на каждом использовании? Это означает, что:

[0] int 
[1] float 

MSDN от ничего не говорит о порядке элемента в результате сбора, однако примеры показывают, что порядок элементы из первой коллекции, то элементы из второй коллекции.

ответ

7

Concat - метод LINQ. Это означает, что это запрос. Он не создает список или какой-либо другой вид коллекции, а последовательность.

Так что же Concat на самом деле это объединение двух исходных последовательностей. Когда вы повторяете результат Concat, вы сначала итерации через первую последовательность, а затем через вторую последовательность. Таким образом, последовательность не изменяется.

Так что, да

деталь будет int не float после Concat на каждом использовании


MSDN от ничего не говорит о порядке элементов

Ну это does say

Конкатенации двух последовательностей.

И to concatenate означает поставить одну после другой, чтобы не перепутать их.


Из reference source:

public static IEnumerable<TSource> Concat<TSource>(this IEnumerable<TSource> first, IEnumerable<TSource> second) { 
    if (first == null) throw Error.ArgumentNull("first"); 
    if (second == null) throw Error.ArgumentNull("second"); 
    return ConcatIterator<TSource>(first, second); 
} 

static IEnumerable<TSource> ConcatIterator<TSource>(IEnumerable<TSource> first, IEnumerable<TSource> second) { 
    foreach (TSource element in first) yield return element; 
    foreach (TSource element in second) yield return element; 
} 

Таким образом, вы видите два последовательных foreach будет первый выход элементов первой последовательности, то элемент второй последовательности.

Смежные вопросы