Przykro mi, aby ożywić stary wątek, ale co z tym:
static IEnumerable<T> Merge<T>(params T[][] arrays)
{
var merged = arrays.SelectMany(arr => arr);
foreach (var t in merged)
yield return t;
}
Następnie w kodzie:
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[]
Dopóki nie zadzwonisz .ToArray()
, .ToList()
lub .ToDictionary(...)
pamięć nie zostanie przydzielona, możesz „zbudować zapytanie” i albo zadzwonić do jednego z tych trzech, aby je wykonać, lub po prostu przejrzeć je wszystkie, używając foreach (var i in z){...}
klauzuli, która zwraca element na raz z yield return t;
powyżej...
Powyższą funkcję można przekształcić w rozszerzenie w następujący sposób:
static IEnumerable<T> Merge<T>(this T[] array1, T[] array2)
{
var merged = array1.Concat(array2);
foreach (var t in merged)
yield return t;
}
Więc w kodzie możesz zrobić coś takiego:
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[]
Reszta jest taka sama jak poprzednio.
Kolejnym ulepszeniem tego byłoby przekształcenie się T[]
w IEnumerable<T>
(tak params T[][]
by się stało params IEnumerable<T>[]
), aby te funkcje akceptowały więcej niż tylko tablice.
Mam nadzieję że to pomoże.