Извините, что оживил старую ветку, но как на счет этого:
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>[]
), чтобы эти функции принимали больше, чем просто массивы.
Надеюсь, это поможет.