很抱歉挖起一个旧的帖子,但是现在来看这个问题:
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(...)
之前,内存不会被分配,您可以自由地“构建查询”,并通过使用返回
yield return t;
中的一项来遍历它们所有,也可以通过使用
foreach(var i in z){...}
子句来遍历它们所有...
以上函数可以制作为以下扩展:
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);
var za=z.ToArray();
其余的部分与以前相同。
对此的另一个改进是将T[]
更改为IEnumerable<T>
(因此params T[][]
将变为params IEnumerable<T>[]
),以使这些函数接受更多种类的输入,而不仅仅是数组。
希望这能够帮到您。