2017-02-14 2 views
3

Est-ce que Enumerable.Concat est toujours ajouté à la fin de la première collection?Enumerable.Concat est-il toujours ajouté à la fin de la première collection?

Exemple:

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

est-il garanti que le item sera int pas float après Concat sur chaque utilisation? Cela signifie:

[0] int 
[1] float 

Le rien MSDN dit à propos de l'ordre des éléments dans la collecte résultant cependant des exemples montrent que l'ordre est des éléments de première collection puis éléments de deuxième collection.

Répondre

7

Concat est une méthode LINQ. Cela signifie que c'est une requête . Il ne crée pas une liste ou un autre type de collection mais une séquence.

Donc ce que Concat fait réellement est combinant les deux séquences source. Lorsque vous parcourez le résultat de Concat, vous parcourez d'abord la première séquence, puis la deuxième séquence. Les séquences ne sont donc jamais changées.

Alors, oui

l'article sera int pas float après Concat sur chaque utilisation


Le rien MSDN dit à propos de l'ordre des éléments

bien il does say

Concatène deux séquences.

Et to concatenate signifie mettre un après l'autre, de ne pas les mélanger.


De l'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; 
} 

Vous voyez les deux foreach consécutifs d'abord donner les éléments de la première séquence, l'élément de la deuxième séquence.