Dường như bạn tìm thấy một câu trả lời thích hợp cho vấn đề của bạn, nhưng kể từ khi danh hiệu yêu cầu một mảng đa chiều (mà tôi đọc như 2 hoặc nhiều), và đây là kết quả tìm kiếm đầu tiên tôi nhận được khi tìm kiếm đó, tôi sẽ thêm giải pháp của tôi:
public static class MultidimensionalArrayExtensions
{
/// <summary>
/// Projects each element of a sequence into a new form by incorporating the element's index.
/// </summary>
/// <typeparam name="T">The type of the elements of the array.</typeparam>
/// <param name="array">A sequence of values to invoke the action on.</param>
/// <param name="action">An action to apply to each source element; the second parameter of the function represents the index of the source element.</param>
public static void ForEach<T>(this Array array, Action<T, int[]> action)
{
var dimensionSizes = Enumerable.Range(0, array.Rank).Select(i => array.GetLength(i)).ToArray();
ArrayForEach(dimensionSizes, action, new int[] { }, array);
}
private static void ArrayForEach<T>(int[] dimensionSizes, Action<T, int[]> action, int[] externalCoordinates, Array masterArray)
{
if (dimensionSizes.Length == 1)
for (int i = 0; i < dimensionSizes[0]; i++)
{
var globalCoordinates = externalCoordinates.Concat(new[] { i }).ToArray();
var value = (T)masterArray.GetValue(globalCoordinates);
action(value, globalCoordinates);
}
else
for (int i = 0; i < dimensionSizes[0]; i++)
ArrayForEach(dimensionSizes.Skip(1).ToArray(), action, externalCoordinates.Concat(new[] { i }).ToArray(), masterArray);
}
public static void PopulateArray<T>(this Array array, Func<int[], T> calculateElement)
{
array.ForEach<T>((element, indexArray) => array.SetValue(calculateElement(indexArray), indexArray));
}
}
Cách sử dụng Ví dụ:
var foo = new string[,] { { "a", "b" }, { "c", "d" } };
foo.ForEach<string>((value, coords) => Console.WriteLine("(" + String.Join(", ", coords) + $")={value}"));
// outputs:
// (0, 0)=a
// (0, 1)=b
// (1, 0)=c
// (1, 1)=d
// Gives a 10d array where each element equals the sum of its coordinates:
var bar = new int[4, 4, 4, 5, 6, 5, 4, 4, 4, 5];
bar.PopulateArray(coords => coords.Sum());
ý tưởng chung là để recurse xuống thông qua kích thước . Tôi chắc chắn rằng các chức năng sẽ không giành được các giải thưởng hiệu quả, nhưng nó hoạt động như một bộ khởi tạo một lần cho mạng của tôi và đi kèm với một ForEach đủ tốt để lộ ra các giá trị và chỉ số. Nhược điểm chính tôi đã không được giải quyết là nhận được nó để tự động nhận ra T từ Array, do đó, một số thận trọng là cần thiết khi nói đến an toàn loại.
tại sao không chỉ sử dụng vòng lặp với chỉ mục? –