298 votes

Comment concaténer deux IEnumerable<T> dans un nouveau IEnumerable<T> ?

J'ai deux instances de IEnumerable<T> (avec le même T ). Je veux une nouvelle instance de IEnumerable<T> qui est la concaténation des deux.

Existe-t-il une méthode intégrée dans .NET pour faire cela ou dois-je l'écrire moi-même ?

476voto

Jon Skeet Points 692016

Oui, LINQ to Objects supporte cela avec Enumerable.Concat :

var together = first.Concat(second);

NB : Devrait first o second être nulle, vous recevriez un ArgumentNullException . Pour éviter cela et traiter les nuls comme vous le feriez pour un ensemble vide, utilisez l'opérateur de coalescence des nuls comme suit :

var together = (first ?? Enumerable.Empty<string>()).Concat(second ?? Enumerable.Empty<string>()); //amending `<string>` to the appropriate type

26voto

supercat Points 25534

El Concat retournera un objet qui implémente IEnumerable<T> en retournant un objet (appelé Cat) dont l'énumérateur tentera d'utiliser les deux éléments énumérables passés (appelés A et B) en séquence. Si les énumérables passés représentent des séquences qui ne changeront pas pendant la durée de vie de Cat, et qui peuvent être lues sans effets secondaires, alors Cat peut être utilisé directement. Sinon, il peut être judicieux d'appeler ToList() sur Cat et utiliser le résultat List<T> (qui représentera un instantané du contenu de A et B).

Certains énumérables prennent un instantané au début de l'énumération, et renverront les données de cet instantané si la collection est modifiée pendant l'énumération. Si B est un tel énumérable, alors toute modification de B survenant avant que Cat n'ait atteint la fin de A apparaîtra dans l'énumération de Cat, mais les modifications survenant après ne le feront pas. Une telle sémantique peut prêter à confusion ; prendre un instantané de Cat peut éviter de tels problèmes.

13voto

craig1231 Points 3535

Je sais que c'est un article relativement ancien, mais si vous voulez concaténer plusieurs IEnumerable, j'utilise la méthode suivante

var joinedSel = new[] { first, second, third }.Where(x => x != null).SelectMany(x => x);

Cela élimine les IEnumerable nuls et permet des concaténations multiples.

10voto

Jay Shukla Points 276

Vous pouvez utiliser le code ci-dessous pour votre solution:-

public void Linq94() 
{ 
    int[] numbersA = { 0, 2, 4, 5, 6, 8, 9 }; 
    int[] numbersB = { 1, 3, 5, 7, 8 }; 

    var allNumbers = numbersA.Concat(numbersB); 

    Console.WriteLine("All numbers from both arrays:"); 
    foreach (var n in allNumbers) 
    { 
        Console.WriteLine(n); 
    } 
}

-3voto

Hasse Points 11
// The answer that I was looking for when searching
public void Answer()
{
    IEnumerable<YourClass> first = this.GetFirstIEnumerableList();
    // Assign to empty list so we can use later
    IEnumerable<YourClass> second = new List<YourClass>();

    if (IwantToUseSecondList)
    {
        second = this.GetSecondIEnumerableList();  
    }
    IEnumerable<SchemapassgruppData> concatedList = first.Concat(second);
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X