Entschuldigung, dass ich ein altes Thema wieder aufgreife, aber wie wäre es damit:
static IEnumerable<T> Merge<T>(params T[][] arrays)
{
var merged = arrays.SelectMany(arr => arr);
foreach (var t in merged)
yield return t;
}
Dann in Ihrem Code:
int[] x={1, 2, 3};
int[] y={4, 5, 6};
var z=Merge(x, y); // 'z' is IEnumerable<T>
var za=z.ToArray(); // 'za' is int[]
Bis Sie anrufen .ToArray()
, .ToList()
, oder .ToDictionary(...)
wird der Speicher nicht zugewiesen, können Sie Ihre Abfrage erstellen und entweder eine dieser drei Abfragen aufrufen, um sie auszuführen, oder einfach alle Abfragen durchgehen, indem Sie foreach (var i in z){...}
Klausel, die jeweils ein Element aus der yield return t;
oben...
Die obige Funktion kann wie folgt in eine Erweiterung umgewandelt werden:
static IEnumerable<T> Merge<T>(this T[] array1, T[] array2)
{
var merged = array1.Concat(array2);
foreach (var t in merged)
yield return t;
}
Im Code können Sie also etwas tun wie:
int[] x1={1, 2, 3};
int[] x2={4, 5, 6};
int[] x3={7, 8};
var z=x1.Merge(x2).Merge(x3); // 'z' is IEnumerable<T>
var za=z.ToArray(); // 'za' is int[]
Der Rest ist derselbe wie zuvor.
Eine weitere Verbesserung wäre die Änderung T[]
in IEnumerable<T>
(also die params T[][]
werden würde params IEnumerable<T>[]
), damit diese Funktionen mehr als nur Arrays akzeptieren.
Ich hoffe, das hilft.