Инициализировать вложенный список <T> - PullRequest
0 голосов
/ 28 мая 2018

Пожалуйста, обратитесь к приведенному ниже коду

List<ProductDM> productDMList = _orderRepo.GetProductList(32, 12);
  for (int i=0;i<productDMList.Count;i++)
        {
            productDMList[i].CabinetList[i].Min = productDMList[i].Min;
            productDMList[i].CabinetList[i].Max = productDMList[i].Max;
        }

public class ProductDM
  {
    public List<InventoryDM> CabinetList { get; set; }
    public double Min { get; set; }
    public double Max { get; set; }
 }
public class InventoryDM
 {
    public Double Min { get; set; }
    public Double Max { get; set; }
 }

Требуется выполнить цикл по productDMList и связать возвращенные значения MIN и MAX в списке кабинета.ProductDM заполняется суммами MIN и MAX, но при назначении их для CabinetList возвращает ошибку.

Это связано с тем, что CabinetList изначально пуст и в нем не отображаются свойства MIN MAX.

Issue

Я использую приведенный выше код для назначения данных, но возвращает

Ссылка на объект не установлена ​​для экземпляра объекта.

из-за того, что CabinetList пуст.

Как инициализировать список кабинетов здесь ???

Ответы [ 3 ]

0 голосов
/ 28 мая 2018

В зависимости от ваших требований вы можете сделать что-то вроде этого

public class ProductDM
{
  public List<InventoryDM> CabinetList { get; private set; }
  public double Min { get; set; }
  public double Max { get; set; }

  public ProductDM()
  {
    CabinetList = new List<InventoryDM>();
  }
}

или если вы получите CabinetList данные из внешнего источника, например, базы данных:

public class ProductDM
{
  private List<InventoryDM> _cabinetList = null;

  public double Min { get; set; }
  public double Max { get; set; }

  public List<InventoryDM> CabinetList
  { get
    {
      if(_cabinetList == null)
      {
        _cabinetList = ... // retrieve data from external source
      }
      return _cabinetList; 
    }
  }
}
0 голосов
/ 28 мая 2018

Как Ответ Марко Форберга гласит инициализация CabinetList в конструкторе предотвращает

Ссылка на объект, не установленная для экземпляра объекта.

исключение.

В дополнение к этому вместо присвоения значений Min и Max через индексатор доступа:

productDMList[i].CabinetList[i].Min = productDMList[i].Min;
productDMList[i].CabinetList[i].Max = productDMList[i].Max;

Вам следует использовать метод Add()типа List<>:

productDMList[i].CabinetList.Add(new InventoryDM { Min = productDMList[i].Min, Max = productDMList[i].Max });

в противном случае вы получите

ArgumentOutOfRangeException

, поскольку вы пытаетесь получить доступ к элементу в спискекоторый еще не существует.

0 голосов
/ 28 мая 2018

Проблема не в пустоте CabinetList, а в том, что список объектов пуст, как вы можете видеть в отладчике.Чтобы инициализировать список, вы можете обратиться к ответам на этот пост: Как инициализировать список строк C # (Список ) множеством строковых значений

Обратите внимание, что вы не 'у него есть список строк, но список <InventoryBM> объектов, но концепция аналогична.

...