Извините, что оживил старую ветку, но как насчет этого:
static IEnumerable<T> Merge<T>(params T[][] arrays)
{
var merged = arrays.SelectMany(arr => arr);
foreach (var t in merged)
yield return t;
}
Тогда в вашем коде:
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[]
До тех пор пока вы не вызовете .ToArray()
, .ToList()
или .ToDictionary(...)
, память не выделяется, вы можете «построить свой запрос» и либо вызов одного из этих трех , чтобы выполнить его или просто пройти их все, используя foreach (var i in z){...}
положение , которое возвращает элемент , в то время отyield return t;
выше...
Вышеупомянутая функция может быть превращена в расширение следующим образом:
static IEnumerable<T> Merge<T>(this T[] array1, T[] array2)
{
var merged = array1.Concat(array2);
foreach (var t in merged)
yield return t;
}
Таким образом, в коде вы можете сделать что-то вроде:
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[]
В остальном то же самое, что и раньше.
Еще одно улучшение к этому будет превращаться T[]
в IEnumerable<T>
(так params T[][]
что станетparams IEnumerable<T>[]
) , чтобы сделать эти функции принимают больше , чем просто массивы.
Надеюсь это поможет.