J'ai deux instances de IEnumerable<T>
(avec le même T
). Je veux une nouvelle instance IEnumerable<T>
dont 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?
J'ai deux instances de IEnumerable<T>
(avec le même T
). Je veux une nouvelle instance IEnumerable<T>
dont 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?
Réponses:
Oui, LINQ to Objects prend en charge ceci avec Enumerable.Concat
:
var together = first.Concat(second);
NB: Si first
ou second
être nul, vous recevrez un ArgumentNullException
. Pour éviter cela et traiter les valeurs nulles comme vous le feriez pour un ensemble vide, utilisez l'opérateur de coalescence null comme ceci:
var together = (first ?? Enumerable.Empty<string>()).Concat(second ?? Enumerable.Empty<string>()); //amending `<string>` to the appropriate type
using System.Linq
espace de noms en haut du fichier de code pour voir la méthode d'extension souhaitée dans l'IDE intellisense.
La Concat
méthode retournera un objet qui implémente IEnumerable<T>
en renvoyant un objet (appelez-le Cat) dont l'énumérateur tentera d'utiliser les deux éléments énumérables transmis (appelez-les A et B) dans l'ordre. Si les énumérations transmises 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. Dans le cas contraire, il peut être une bonne idée d'appeler ToList()
sur Cat
et utiliser le résultat List<T>
(qui représentera un aperçu du contenu de A et B).
Certains énumérateurs prennent un instantané au début de l'énumération et renvoient des données à partir de cet instantané si la collection est modifiée pendant l'énumération. Si B est un tel énumérable, alors tout changement à B qui se produit avant que Cat n'ait atteint la fin de A apparaîtra dans l'énumération de Cat, mais les changements qui se produisent après cela ne le seront pas. 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 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);
}