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?
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
_
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.
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);
}
}
//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);
}