2013-07-24 39 views
5

Tôi nhầm giữa double [] [] và double [,] trong C#.
đồng đội của tôi cho tôi một chức năng như thế này:C#: double [] [] và double [,]

public double[][] Do_Something(double[][] A) 
{ 
    ....... 
} 

Tôi muốn sử dụng chức năng này:

double[,] data = survey.GetSurveyData(); //Get data 
double[,] inrma = Do_Something(data); 

Nó dẫn một lỗi: đối số không hợp lệ.
Tôi không muốn chỉnh sửa mã của đồng đội mình.
Có cách nào để chuyển đổi double[][] thành double [,] không?

Cảm ơn!

+10

'double [] []' là một mảng bị lởm chởm. 'double [,]' là một mảng đa chiều. Họ chắc chắn không phải là cùng một loại, và sử dụng của họ khác nhau khá nhiều. Sử dụng đúng loại cho nhiệm vụ phù hợp. –

+0

trùng lặp có thể có của [Tại sao chúng tôi có cả mảng bị lẫn lộn và mảng đa chiều?] (Http://stackoverflow.com/questions/4648914/why-we-have-both-jagged-array-and-multidimentional-array) và [Cái gì khác nhau giữa mảng đa chiều và mảng mảng trong C#?] (http://stackoverflow.com/questions/597720/what-is-differences-between-multidimensional-array-and-array-of-arrays-in-c) –

+0

Bạn hoặc đồng đội của bạn chắc chắn về sự khác nhau giữa chúng là gì? –

Trả lời

8

double[][]double[,] có ý nghĩa khác.

double[][] bị lởm chởm, vì vậy một số phần tử có thể có độ dài khác với độ dài khác.

double[,] là "hình chữ nhật", vì vậy tất cả các phần tử có cùng độ dài.

Bạn có thể viết một phương thức để "chuyển đổi" giữa hai cách, nhưng bạn sẽ khắc phục sự khác biệt như thế nào? I E. làm thế nào bạn sẽ quyết định "cắt" từ các yếu tố dài hoặc mở rộng các yếu tố ngắn để làm cho nó hình chữ nhật?

9

Một double[][] là một mảng của đôi [] (Một mảng của mảng) nhưng double[,] là một đơn 2 chiều mảng đôi

Ví dụ:

double[] Array1 = new double[] {1,2,3}; 
double[] Array2 = new double[] {4,5,6}; 
double[][] ArrayOfArrays = new double[][] {Array1,Array2}; 
double[,] MultidimensionalArray = new double[,] {{1,2}, {3,4}, {5,6}, {7,8}}; 
1
static T[,] Convert<T>(T[][] array) 
{ 
    if (array == null) 
     throw new ArgumentNullException("array"); 
    if (array.Length == 0) 
     return new T[0, 0]; 
    T[,] retval = new T[array.Length, array[0].Length]; 
    for (int i = 0; i < array.Length; i++) 
     for (int j = 0; j < array[i].Length; j++) 
      if (array[i].Length != retval.GetLength(1)) 
       throw new Exception(); 
      else 
       retval[i, j] = array[i][j]; 
    return retval; 
} 
+1

Điều đó chỉ hoạt động với một mảng răng cưa không răng cưa, để làm việc với tất cả các đầu vào, bạn có thể sử dụng 'width = array.Max (a => a.Length)' và điền vào các vùng trống bằng 'default (T)'. Nếu bạn muốn có kiểm tra trong đó, bạn nên di chuyển nó ra một mức độ, do đó, nó chỉ được kiểm tra một lần mỗi hàng, thay vì cho mỗi tế bào. – RoadieRich

1

Họ là hai loại khác nhau của mảng.

double[][] là mảng có răng cưa, là mảng mảng; mỗi mảng có thể có độ dài khác nhau, dẫn đến một vấn đề.

double[,] chỉ là mảng đa chiều. Mỗi hàng sẽ có số cột bằng nhau và mỗi cột sẽ có số hàng bằng nhau.

Sự khác biệt về kích thước này gây ra sự cố vì mảng có răng cưa thực sự có thể là các thứ nguyên khác nhau cho các hàng khác nhau. Bạn có thể viết một phương thức để chuyển đổi giữa hai nếu bạn biết kích thước chính xác của mảng răng cưa, nhưng trong trường hợp đó tôi sẽ gợi ý viết lại phương thức gốc để chấp nhận và trả về mảng đa chiều (double[,]).