Массив списков создает исключение NullReferenceException - PullRequest
1 голос
/ 15 марта 2011

Я пытаюсь сделать массив списков 1d. Я делаю это так:

public static List<string>[] words = new List<string>[30];
public static List<string>[] hints = new List<string>[30];

И я называю это так:

foreach (string item in vars.directory)
        {
            reader2 = new StreamReader(item);
            while (reader2.Peek() > 0)
            {
                string line = reader2.ReadLine();
                if (line.StartsWith("#"))
                {
                    vars.words[counter].Add(line.Substring(1, line.Length - 1)); //here
                }
                else if (line.StartsWith("-"))
                {
                    vars.hints[counter].Add(line.Substring(1, line.Length - 1)); //another here
                }
                else if (line == "@end")
                {
                    counter++;
                }
            }
        }

Я просто хотел добавить, что vars - это место, где я храню свои открытые переменные, и этот счетчик действительно равен 0, когда начинается цикл.

EDIT В спешке я забыл добавить вопрос ... упс ...

Вот оно: когда я вызываю функцию добавления (или любую другую функцию в этом отношении), она возвращает исключение нулевой ссылки. Как я могу это исправить?

Ответы [ 6 ]

7 голосов
/ 15 марта 2011

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

for( Int32 i = 0; i < vars.words.Length; ++i )
  vars.words[i] = new List<string>();
for( Int32 i = 0; i < vars.hints.Length; ++i )
  vars.hints[i] = new List<string>();
6 голосов
/ 15 марта 2011

Почему бы просто не сделать List<List<string>>, но да, вы можете создать массив списков

2 голосов
/ 15 марта 2011

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

-> fi, если размер ваших данных изменится,Вам не нужно менять размер списка, но массив

0 голосов
/ 15 марта 2011

Проблема заключается в том, что значения массива инициализируются значением по умолчанию, а значением по умолчанию для ссылочных типов является null.

default(List<string>) возвращает null.

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

Один из способов инициализации всех объектов в вашем массиве - это использоватьОператор Linq:

const int sizeOfLists = 5;
List<string>[] lists = Enumerable.Range(0, sizeOfLists)
    .Select(i => new List<string>())
    .ToArray();

Другой вариант - инициализировать и добавлять подсписки только тогда, когда они вам нужны, используя внешний список:

var lists = new List<List<string>>();
// ...
var aSubList = new List<string>();
lists.Add(aSubList);

Это особенно полезно, если выне знаю размера внешнего набора списков заранее и все еще доступен по индексу.

(Это был комментарий ранее, но я сделал его ответом, так как многие другие ответы были захваченырешение и не описывать проблему)

0 голосов
/ 15 марта 2011

Вот одна строка для инициализации массива списков размером 30:

    static List<string>[] lists = (from i in Enumerable.Range(0, 30)
                                   select new List<string>()).ToArray();
0 голосов
/ 15 марта 2011

Вы можете инициализировать списки непосредственно перед их использованием:

foreach (string item in vars.directory)
{
    reader2 = new StreamReader(item);
    while (reader2.Peek() > 0)
    {
        string line = reader2.ReadLine();
        // new code
        if (vars.words[counter] == null) vars.words[counter] = new List<string>();
        if (vars.hints[counter] == null) vars.hints[counter] = new List<string>();

        if (line.StartsWith("#"))
        {
            vars.words[counter].Add(line.Substring(1, line.Length - 1)); //here
        }
        else if (line.StartsWith("-"))
        {
            vars.hints[counter].Add(line.Substring(1, line.Length - 1)); //another here
        }
        else if (line == "@end")
        {
            counter++;
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...