Ich habe zwei Instanzen von IEnumerable<T>
(mit dem gleichen T
). Ich möchte eine neue Instanz, von IEnumerable<T>
der beide verkettet sind.
Gibt es eine integrierte Methode in .Net, um dies zu tun, oder muss ich sie selbst schreiben?
Ich habe zwei Instanzen von IEnumerable<T>
(mit dem gleichen T
). Ich möchte eine neue Instanz, von IEnumerable<T>
der beide verkettet sind.
Gibt es eine integrierte Methode in .Net, um dies zu tun, oder muss ich sie selbst schreiben?
Antworten:
Ja, LINQ to Objects unterstützt dies mit Enumerable.Concat
:
var together = first.Concat(second);
NB: Sollte first
oder second
sollte null sein, würden Sie eine erhalten ArgumentNullException
. Um dies zu vermeiden und Nullen wie eine leere Menge zu behandeln, verwenden Sie den Null-Koaleszenzoperator wie folgt:
var together = (first ?? Enumerable.Empty<string>()).Concat(second ?? Enumerable.Empty<string>()); //amending `<string>` to the appropriate type
using System.Linq
Namespace oben in der Codedatei zu importieren , um die gewünschte Erweiterungsmethode in der IDE Intellisense anzuzeigen.
Die Concat
Methode gibt ein Objekt zurück, das implementiert wird, IEnumerable<T>
indem ein Objekt zurückgegeben wird (nennen Sie es Cat), dessen Enumerator versucht, die beiden übergebenen aufzählbaren Elemente (nennen Sie sie A und B) nacheinander zu verwenden. Wenn die übergebenen Aufzählungen Sequenzen darstellen, die sich während der Lebensdauer von Cat nicht ändern und aus denen ohne Nebenwirkungen abgelesen werden kann, kann Cat direkt verwendet werden. Andernfalls kann es eine gute Idee zu nennen sein , ToList()
auf Cat
und verwenden Sie das Ergebnis List<T>
(die eine Momentaufnahme der Inhalte von A und B wird).
Einige Aufzählungen erstellen zu Beginn der Aufzählung einen Snapshot und geben Daten aus diesem Snapshot zurück, wenn die Auflistung während der Aufzählung geändert wird. Wenn B eine solche Aufzählung ist, wird jede Änderung an B, die auftritt, bevor Cat das Ende von A erreicht hat, in der Aufzählung von Cat angezeigt, Änderungen, die danach auftreten, jedoch nicht. Eine solche Semantik kann wahrscheinlich verwirrend sein; Wenn Sie einen Schnappschuss von Cat machen, können Sie solche Probleme vermeiden.
Sie können den folgenden Code für Ihre Lösung verwenden: -
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);
}