2013-07-24 34 views
5

I arasında şaşırtmak C# [], [] [], çift ve çift.
Benim takım arkadaşı böyle bana bir işlev vermek:C#: [], çift [] [] ve çift

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

Bir hata kurşun:

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

Bu fonksiyonu kullanmak isteyen geçersiz argüman.
Takım arkadaşımın kodunu düzenlemek istemiyorum.
o double [,] için double[][] dönüştürmek için herhangi bir yolu var mı?

Teşekkürler!

+10

'ikili [] []' pürüzlü bir dizidir. 'double [,]' çok boyutlu bir dizidir. Kesinlikle aynı türde değiller ve kullanımları oldukça farklı. Doğru görev için doğru tipi kullanın. –

+0

olası niçin [Neden hem pürüzlü dizi hem de multidimentional dizisi var?] (Http://stackoverflow.com/questions/4648914/why-we-have-both-jagged-array-and-multidimentional-array) ve [Ne nedir? C# Dizilerinin boyutlu dizi ve dizi arasındaki farktır?] (http://stackoverflow.com/questions/597720/what-is-differences-between-multidimensional-array-and-array-of-arrays-in-c) –

+0

Siz veya takım arkadaşlarınız aralarındaki farktan emin misiniz? –

cevap

8

double[][] ve double[,] farklı anlamlara sahiptir.

double[][] pürüzlü, yani bazı elemanlar, diğerlerinin daha farklı uzunluklarda olabilir.

double[,] "dikdörtgen", yani tüm elemanlar aynı boydadır.

İkisi arasında "dönüştürmek" için bir yöntem yazabilirsiniz, ancak farklılıkları nasıl düzelteceksiniz? Yani Dikdörtgen yapmak için uzun elementlerden "trim" yapmaya veya kısa elemanları genişletmeye nasıl karar vereceksiniz?

9

bir double[][] çift [] (dizilerin bir dizi) ve bir dizi ancak double[,], tek bir 2 boyutlu çift dizi olduğu

Örnek:

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

Tüm girdilerle çalışmak için yalnızca pürüzlü olmayan bir pürüzlü dizi ile çalışır, 'width = array.Max (a => a.Length)' öğesini kullanabilir ve boş yuvaları 'default (T)' ile doldurabilirsiniz. Check-in işlemine sahip olmak istiyorsanız, onu bir seviyeye taşımalısınız, bu yüzden her hücre için değil, sadece satır başına bir kez kontrol edilir. – RoadieRich

1

Bunlar iki farklı tipi vardır diziler.

double[][]

dizilerin bir dizisi olan bir dişli dizisi, olduğu; Bu dizilerin her birinin farklı bir uzunluğu olabilir, bu da bir soruna yol açar.

double[,] sadece çok boyutlu bir dizindir. Her satırda eşit sayıda sütun bulunacak ve her sütun eşit sayıda satır olacaktır.

Bu boyut farkı, pürüzlü dizi gerçekten farklı satırlar için farklı boyutlar olabileceğinden bir soruna neden oluyor. Jagged dizinin tam boyutlarını bilseydiniz, ikisi arasında dönüştürme için bir yöntem yazabilirsiniz, ancak bu durumda çok boyutlu bir diziyi (double[,]) kabul etmek ve döndürmek için özgün yöntemi yeniden yazmanızı öneririm.