2012-02-15 43 views
11
foreach (String s in arrayOfMessages) 
{ 
    System.Console.WriteLine(s); 
} 

string[,] arrayOfMessages đang được chuyển thành tham số.Làm thế nào để bạn lặp qua một mảng đa chiều?

Tôi muốn có thể xác định chuỗi nào là từ arrayOfMessages[0,i]arrayOfMessages[n,i], trong đó n là chỉ mục cuối cùng của mảng.

+1

tại sao không chỉ sử dụng vòng lặp với chỉ mục? –

Trả lời

30

Đơn giản chỉ cần sử dụng hai lồng nhau for vòng. Để có được kích thước của các yếu tố, bạn có thể sử dụng GetLength():

for (int i = 0; i < arrayOfMessages.GetLength(0); i++) 
{ 
    for (int j = 0; j < arrayOfMessages.GetLength(1); j++) 
    { 
     string s = arrayOfMessages[i, j]; 
     Console.WriteLine(s); 
    } 
} 

này giả định bạn thực sự có string[,]. Trong. Net nó cũng có thể có mảng đa chiều không được lập chỉ mục từ 0. Trong trường hợp đó, chúng phải được biểu diễn là Array trong C# và bạn sẽ cần sử dụng GetLowerBound()GetUpperBound() để nhận giới hạn cho mỗi thứ nguyên.

7

Với lồng nhau vòng lặp for:

for (int row = 0; row < arrayOfMessages.GetLength(0); row++) 
{ 
    for (int col = 0; col < arrayOfMessages.GetLength(1); col++) 
    { 
     string message = arrayOfMessages[row,col]; 
     // use the message 
    }  
} 
1

Something như thế này sẽ làm việc:

int length0 = arrayOfMessages.GetUpperBound(0) + 1; 
int length1 = arrayOfMessages.GetUpperBound(1) + 1; 

for(int i=0; i<length1; i++) { string msg = arrayOfMessages[0, i]; ... } 
for(int i=0; i<length1; i++) { string msg = arrayOfMessages[length0-1, i]; ... } 
1

Bạn có thể sử dụng mã dưới đây để chạy các mảng đa chiều.

foreach (String s in arrayOfMessages) 
{ 
    System.Console.WriteLine("{0}",s); 
} 
0

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.

Các vấn đề liên quan