Как построить массив списков структур в C # (с предопределенным размером массива) - PullRequest
0 голосов
/ 23 сентября 2019

Попытка построить массив списков структур в C #.И получение System.NullReferenceException с наилучшей попыткой (ошибка в строке test[i].Add(info1);)

Вопрос не в том, как избежать System.NullReferenceException привсе, но больше похоже на то, как быстро создать массив списков с предопределенным размером массива, чтобы можно было использовать array[i].Add(Struct) в нем.Если это возможно, без зацикливания всего массива, просто для создания списков.

Итак, вот требования:

  • размер массива должен быть предопределен;
  • номера списков на узел должны быть произвольными, и должна быть возможность их легкого добавления;
  • структура должна содержать struct Info.

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

using System.Collections.Generic;

class Startup
{
    static void Main()
    {
        int entry = 1233;
        List<Info>[] test = new List<Info>[entry];

        for (int i = 0; i < 500 ; i+=3)
        {
            Info info1 = new Info()
            {
                capacity = i * 2,
                name = i.ToString()
            };
            test[i].Add(info1);
        }
        for (int i = 0; i < 1000; i+=5)
        {
            Info info2 = new Info();
            info2.capacity = i * 2;
            info2.name = i.ToString() + i.ToString();
            test[i].Add(info2);
        }
    }

    struct Info
    {
        public int capacity;
        public string name;
    }
}

Ответы [ 3 ]

1 голос
/ 23 сентября 2019

Попробуйте это:

using System.Collections.Generic;

class Startup
{
    static void Main()
    {
        int entry = 1233;
        List<Info>[] test = new List<Info>[entry];

        for (int i = 0; i < 500 ; i+=3)
        {
            Info info1 = new Info()
            {
                capacity = i * 2,
                name = i.ToString()
            };
            test[i] = new List<Info> {info1};
        }
        for (int i = 0; i < 1000; i += 5)
        {
            Info info2 = new Info();
            info2.capacity = i * 2;
            info2.name = i.ToString() + i.ToString();
            if (test[i] == null)
            {
                test[i] = new List<Info> { info2 };
            }
            else
            {
                test[i].Add(info2);
            }
        }
    }

    struct Info
    {
        public int capacity;
        public string name;
    }
}
1 голос
/ 23 сентября 2019

Попробуйте это:

using System.Collections.Generic;

class Startup
{
  static void Main()
  {
    int entry = 1233;
    var test = Enumerable.Range(0,entry)
      .Select(i=> {
        var y = new List<Info>();
        if(i%3==0 && i < 500)
        {
          y.Add(new Info {
            capacity = i*2,
            name = i.ToString()
          });
        }
        if(i%5==0 && i < 1000)
        {
          y.Add(new Info {
            capacity = i*2,
            name = i.ToString() + i.ToString()
          });
        }
        return y;
      }).ToArray();
    }

    struct Info
    {
        public int capacity;
        public string name;
    }
}
1 голос
/ 23 сентября 2019

Каждый элемент массива не определен, так как объект является List

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

using System.Collections.Generic;
class Startup
{
    static void Main()
    {
        int entry = 1233;
        List<Info>[] test = new List<Info>[entry];

        for (int i = 0; i < 500 ; i+=3)
        {
            Info info1 = new Info()
            {
                capacity = i * 2,
                name = i.ToString()
            };

            // if null initialise the list
            if(test[i] == null) test[i] = new List<Info>();

            test[i].Add(info1);
        }
        for (int i = 0; i < 1000; i+=5)
        {
            Info info2 = new Info();
            info2.capacity = i * 2;
            info2.name = i.ToString() + i.ToString();

            // if null initialise the list
            if(test[i] == null) test[i] = new List<Info>(); 

            test[i].Add(info2);
        }
    }

    struct Info
    {
        public int capacity;
        public string name;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...