Как правильно инициализировать этот массив перед использованием, когда я не знаю верхних значений? - PullRequest
0 голосов
/ 08 апреля 2011

У меня есть следующий раздел кода, который воздействует на значения в <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; }
}

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

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

Спасибо

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

Ответы [ 5 ]

4 голосов
/ 08 апреля 2011

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

2 голосов
/ 08 апреля 2011

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

List<string> list = new List<string>();
foreach (XPathNavigator test in Service.Select("Testname"))
{
    list.Add(test.Value);
}
var arrayIfYouStillNeedOne = list.ToArray();
1 голос
/ 08 апреля 2011

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

0 голосов
/ 08 апреля 2011

Вы можете сделать это в одну строку с LINQ:

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

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

0 голосов
/ 08 апреля 2011

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

, например

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