Как мне правильно инициализировать этот массив перед использованием, если я не знаю верхних значений?

#c# #arrays #initialization #nullreferenceexception

#c# #массивы #инициализация #исключение nullreferenceexception

Вопрос:

У меня есть следующий раздел кода, который воздействует на значения в <Test></Test> узлах из xml-файла:

 var tests = new ServicesTests();
var testcase = new TestData();

var x = 0;
foreach (XPathNavigator test in Service.Select("Testname"))
{
    testcase.Testname[x] = test.Value;
    x  ;
}
tests.ServiceTests.Add(testcase);
  

Объекты были объявлены здесь:

 public class ServicesTests
{
    public List<TestData> ServiceTests = new List<TestData>();
}

public class TestData
{
    ...
    public string[] Testname { get; set; }
}
  

Теперь я получаю исключение ссылки на нулевое значение при попытке установить массив. Я понимаю почему, но я не уверен, как правильно его инициализировать, поскольку у меня не будет возможности узнать, сколько там может быть значений. Все примеры, которые я прочитал, похоже, предполагают знание этого..

Есть предложения о том, как это должно быть сделано правильно?

Спасибо

РЕДАКТИРОВАТЬ: я обновил, чтобы добавить некоторый код, ранее отсутствовавший, поскольку использование списка по-прежнему возвращает ошибку нулевой ссылки.

Ответ №1:

Если вам нужен расширяемый массив, вам нужно будет написать код для управления его размером и увеличивать его по мере необходимости, или же вы могли бы вместо этого использовать List<string> и преобразовать его в массив, когда закончите добавлять элементы с помощью ToArray()

Ответ №2:

Пример приведенных выше хороших ответов.

 List<string> list = new List<string>();
foreach (XPathNavigator test in Service.Select("Testname"))
{
    list.Add(test.Value);
}
var arrayIfYouStillNeedOne = list.ToArray();
  

Ответ №3:

Вы, вероятно, хотите вместо этого использовать универсальный List<string> . Вы можете просто использовать его Add метод, чтобы поместить в него что-то. Если вам нужен массив, когда все сказано и сделано, его легко преобразовать с помощью myList.ToArray() .

Комментарии:

1. На самом деле, вам не нужен linq для этого, потому что List<T> имеет свой собственный метод экземпляра toArray() .

2. Я только что сделал это, переключив свое объявление на использование «public List<string> Testname { get; set; } и затем изменив свой код на: testcase . Имя_теста. Добавить (тест. Значение) и он по-прежнему возвращает нулевую ссылку для testcase. Имя_теста. Не уверен, в чем проблема сейчас.

3. О, хорошо, я так привык к linq для Ienumerables, что совершенно забыл, что это тоже метод списка!

4. Вам нужно составить new список. Каждый объект начинается с null . например public List<string> TestName = new List<string>() или, если вы хотите использовать свойство, вам нужно использовать его для отложенной загрузки или инициализировать его в другом месте.

Ответ №4:

Используйте коллекцию списков, размер которой может динамически изменяться по мере добавления значений, затем вы можете преобразовать список в массив, если вам нужно.

например

 var list = new List<string>();
foreach (XPathNavigator test in Service.Select("Testname"))
{
    list.Add(test.Value);
}

// If you need to get the values as an array

string[] array = list.ToArray();
  

Ответ №5:

Вы можете сделать это в одной строке с помощью LINQ:

 testcase.TestName = Service.Select("Testname").Select(x => x.Value).ToArray();
  

Вам даже не нужно знать размер массива.