Xin lỗi để hồi sinh một chủ đề cũ, nhưng làm thế nào về điều này:
static IEnumerable<T> Merge<T>(params T[][] arrays)
{
var merged = arrays.SelectMany(arr => arr);
foreach (var t in merged)
yield return t;
}
Sau đó, trong mã của bạn:
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[]
Cho đến khi bạn gọi .ToArray()
, .ToList()
hoặc .ToDictionary(...)
, bộ nhớ không được phân bổ, bạn có thể tự do "xây dựng truy vấn của mình" và gọi một trong ba người đó để thực hiện nó hoặc chỉ đơn giản là đi qua tất cả chúng bằng cách sử dụng foreach (var i in z){...}
mệnh đề trả về một mục tại một thời điểm từ yield return t;
ở trên...
Các chức năng trên có thể được thực hiện thành một phần mở rộng như sau:
static IEnumerable<T> Merge<T>(this T[] array1, T[] array2)
{
var merged = array1.Concat(array2);
foreach (var t in merged)
yield return t;
}
Vì vậy, trong mã, bạn có thể làm một cái gì đó như:
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[]
Phần còn lại vẫn như trước.
Một cải tiến khác cho điều này sẽ được thay đổi T[]
thành IEnumerable<T>
(vì vậy params T[][]
sẽ trở thành params IEnumerable<T>[]
) để làm cho các hàm này chấp nhận nhiều hơn là chỉ các mảng.
Hi vọng điêu nay co ich.