Определить двойной массив без фиксированного размера?
Вопрос
Здравствуйте, у меня проблема с массивами С#.Мне нужен массив для хранения там некоторых данных...Мой код заключается в том, что
double[] ATmittelMin;
ATmittelMin[zaehlMittel] = Gradient(x, xATmax, y, yATmax);
Но компилятор говорит:Не определено, как я могу определить двойной массив без фиксированного размера?Большое спасибо!
Решение
Массивы всегда имеют фиксированный размер и должны быть определены следующим образом:
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};
Класс List<T>
использует массив в фоновом режиме и переопределяет его, когда ему не хватает места:
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();
Вы можете перебирать <=> так же, как и массив:
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]);
}
Другие советы
Насколько я вижу, вы не заявили zaehlMittel
переменная.Я думаю, это то, на что жалуется компилятор.
Кроме того, хотя вы, конечно, можете определить значение этой переменной программно, в тот момент, когда вы хотите создать массив, необходимо знать его размер.Именно так работают массивы.
Если вы не можете сделать это легко, я предлагаю использовать какую-то динамическую структуру данных, например список или набор.Затем, как только все элементы будут добавлены, вы, конечно, по-прежнему можете создать из него массив, поскольку к тому времени вы знаете количество элементов (хотя существуют такие удобные методы, как toArray()
это даже позаботится об этом).
Вы должны создать экземпляр массива перед его использованием:
double[] ATmittelMin = new double[10];
ATmittelMin[zaehlMittel] = Gradient(x, xATmax, y, yATmax);
Очевидное решение, которое приходит на ум, - это использовать List:
List<double> ATmittelMin = new List<double>();
ATmittelMin.Add(Gradient(x, xATMax, y, yATMax);
Но если вы не хотите преобразовывать список в массив, вы можете увеличить его позже:
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
}
Это не идеально, так как вы выполняете большую часть работы, которую List
выполняет за кулисами, - возможно, намного эффективнее, чем вы можете.