2009-06-22 9 views
5

Witam mam problem z C# Arrays. Potrzebuję tablicy do przechowywania niektórych danych tam ... mój kod jestDefiniowanie podwójnej macierzy bez ustalonego rozmiaru?

double[] ATmittelMin; 
ATmittelMin[zaehlMittel] = Gradient(x, xATmax, y, yATmax); 

ale kompilator mówi: niezdefiniowane var Jak mogę określić podwójną tablicę bez stałej wielkości? Wielkie dzięki!

Odpowiedz

15

Tablice są zawsze stałej wielkości i muszą być zdefiniowane w taki sposób:

double[] items1 = new double[10]; 

// This means array is double[3] and cannot be changed without redefining it. 
double[] items2 = {1.23, 4.56, 7.89}; 

Klasa List<T> wykorzystuje tablicę w tle i na nowo definiuje ją, gdy zabraknie miejsca:

List<double> items = new List<double>(); 
items.Add(1.23); 
items.Add(4.56); 
items.Add(7.89); 

// This will give you a double[3] array with the items of the list. 
double[] itemsArray = items.ToArray(); 

można iterację List<T> tak samo jak tablica:

foreach (double item in items) 
{ 
    Console.WriteLine(item); 
} 

// Note that the property is 'Count' rather than 'Length' 
for (int i = 0; i < items.Count; i++) 
{ 
    Console.WriteLine(items[i]); 
} 
+0

Jak mogę iterować listę? – subprime

+0

@ subprime: foreach (podwójna pozycja w pozycji) {...}, lub za pomocą pozycji [n] indexer –

+0

dzięki! to jest odpowiedź :) – subprime

0

Z tego, co widzę, nie zadeklarowałeś zmiennej zaehlMittel. Zgaduję, że na to kompiluje się kompilator.

Niezależnie od tego, chociaż można oczywiście określić wartość tej zmiennej programowo, to w momencie, w którym chcemy utworzyć tablicę, musi być znana jej wielkość. W ten sposób działają tablice.

Jeśli nie możesz zrobić tego łatwo, sugeruję użycie jakiejś dynamicznej bazy danych, takiej jak lista lub zestaw. Następnie, po dodaniu wszystkich elementów, oczywiście nadal możesz tworzyć z nich tablicę, ponieważ do tego czasu znasz liczbę elementów (nawet jeśli istnieją metody wygody, takie jak toArray(), które to w ogóle o to zadbają).

0

Trzeba instanciate tablicę przed użyciem go:

double[] ATmittelMin = new double[10]; 
ATmittelMin[zaehlMittel] = Gradient(x, xATmax, y, yATmax); 
+0

Działa tylko jeśli zaehlMittel <10 – ChrisF

0

Oczywistym rozwiązaniem, które przychodzi na myśl jest użycie listy:

List<double> ATmittelMin = new List<double>(); 
ATmittelMin.Add(Gradient(x, xATMax, y, yATMax); 

Ale jeśli nie chcesz przekonwertować z listy do tablicy możesz rozwinąć tablicę później:

double[] ATmittelMin = new double[10]; 
// Some code 
int index = some_value; 
if (index >= TmittelMin.Length) 
{ 
    Array.Resize(ATmittelMin, index+5); // So we're not constantly resizing the array 
} 

To nie jest idealne, ponieważ robisz dużo praca, którą wykonuje List za kulisami - prawdopodobnie o wiele wydajniej niż Ty.

Powiązane problemy