web-dev-qa-db-fra.com

Comment concaténer deux IEnumerable <T> dans un nouvel 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 le faire ou dois-je l'écrire moi-même?

166
Samuel Rossille

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

_var together = first.Concat(second);
_

NB: Si first ou second était nul, vous recevrez un ArgumentNullException. Pour éviter cela et traiter les valeurs NULL comme un ensemble vide, utilisez l'opérateur de fusion Null comme suit:

_var together = (first ?? Enumerable.Empty<string>()).Concat(second ?? Enumerable.Empty<string>()); //amending `<string>` to the appropriate type
_
281
Jon Skeet

La méthode Concat renverra un objet qui implémentera IEnumerable<T> en renvoyant un objet (appelez-le Cat) dont l'énumérateur essaiera d'utiliser les deux éléments énumérés passés (appelez-les A et B) en séquence. Si les énumérables passés représentent des séquences qui ne changeront pas pendant la 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 d’utiliser le résultat List<T> (qui représente 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 au cours de l'énumération. Si B est si énumérable, toute modification apportée à B avant que Cat ait atteint la fin de A apparaît dans l'énumération de Cat, mais pas les modifications ultérieures. Une telle sémantique peut être source de confusion. prendre un instantané de Cat peut éviter de tels problèmes.

17
supercat

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); 
    } 
}
7
Jay Shukla
//The answare 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);
}
0
Hasse