2009-06-22 40 views
5

Xin chào tôi có vấn đề với C# Mảng. Tôi cần một mảng để lưu trữ một số dữ liệu trong đó ... Mã của tôi làXác định một mảng kép không có kích thước cố định?

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

Nhưng trình biên dịch nói: không được định nghĩa var Làm thế nào tôi có thể định nghĩa một mảng đôi mà không có một kích thước cố định? Cảm ơn rất nhiều!

Trả lời

15

Mảng luôn cố định về kích thước, và đã được xác định như sau:

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}; 

Lớp List<T> sử dụng một mảng ở chế độ nền và định nghĩa lại nó khi nó chạy ra khỏi không gian:

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(); 

Bạn có thể lặp qua một số List<T> giống như bạn làm một mảng:

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

cách tôi có thể lặp qua danh sách – subprime

+0

@subprime: foreach (mục kép trong mục) {...} hoặc qua các mục [n] chỉ mục –

+0

cảm ơn! đây là câu trả lời :) – subprime

0

Từ những gì tôi thấy bạn không khai báo biến số zaehlMittel. Tôi đoán đây là những gì trình biên dịch phàn nàn về.

Ngoài ra, mặc dù bạn tất nhiên có thể xác định giá trị của biến đó theo lập trình, thời điểm bạn muốn tạo một mảng có kích thước của nó phải được biết. Đây là cách mảng hoạt động.

Trong trường hợp bạn không thể thực hiện điều đó một cách dễ dàng, tôi khuyên bạn nên sử dụng một số loại cơ sở hạ tầng động, như danh sách hoặc tập hợp. Sau đó, một khi tất cả các phần tử đã được thêm vào, bạn tất nhiên vẫn còn tự do để tạo một mảng từ đó, như lúc đó bạn biết số phần tử (mặc dù có các phương thức tiện lợi như toArray() thậm chí sẽ quan tâm đến điều đó).

0

Bạn phải instanciate mảng trước khi sử dụng nó:

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

Chỉ hoạt động nếu zaehlMittel <10 – ChrisF

0

Các giải pháp rõ ràng mà lò xo để tâm là sử dụng một danh sách:

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

Nhưng nếu bạn không muốn chuyển đổi từ danh sách tới một mảng, bạn có thể phát triển mảng sau:

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 
} 

Nó không lý tưởng vì bạn đang làm rất nhiều công việc mà List đang làm phía sau hậu trường - có thể hiệu quả hơn rất nhiều so với bạn có thể.

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