#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();
Вам даже не нужно знать размер массива.