【问题标题】:Initialize Nested List<T>初始化嵌套列表<T>
【发布时间】:2018-11-06 20:57:20
【问题描述】:

请参考以下代码

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并将返回的MINMAX值绑定到cabinet列表中。 ProductDM 填充了 MIN 和 MAX 数量,但将它们分配给 CabinetList 时,它会返回错误。

这是因为 CabinetList 最初是空的,并且其中没有显示 MIN MAX 属性。

我正在使用上面的代码分配数据但返回

对象引用未设置为对象的实例。

因为 CabinetList 为空。

这里如何初始化橱柜列表???

【问题讨论】:

  • 通过在构造函数中创建一个新列表并将其分配给CabinetList? 声明一个成员并不隐含创建一个实例。列表在开始时应该包含什么?
  • ProductDM 需要一个带有 List&lt;InventoryDM&gt; 参数的构造函数
  • 在你的ProductDM构造函数中,输入CabinetList = new List&lt;InventoryDM&gt;()
  • @HimBromBeere 最初 MIN 和 MAX = 0
  • 除了之前的 cmets:在分配 MinMax 时,使用 List&lt;&gt;Add() 方法来避免 ArgumentOutOfRangeExceptionproductDMList[i].CabinetList.Add(new InventoryDM {Min = productDMList[i].Min, Max = productDMList[i].Max});

标签: c# arrays list initialization


【解决方案1】:

问题不在于 CabinetList 为空,而是对象列表为空,正如您在调试器中看到的那样。
为了初始化列表,您可以参考这篇文章的答案: How to initialize a C# string list (List<string>) with many string values

请注意,您没有字符串列表,而是&lt;InventoryBM&gt; 对象列表,但概念类似。

【讨论】:

    【解决方案2】:

    根据你的要求,你可以做这样的事情

    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; 
        }
      }
    }
    

    【讨论】:

      【解决方案3】:

      由于Marco Forberg's answer states 在构造函数中初始化CabinetList 可以防止

      对象引用未设置为对象的实例。

      异常。

      除此之外,不要通过索引访问器分配 MinMax 值:

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

      你应该使用List&lt;&gt;类型的Add()方法:

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

      否则你会得到一个

      ArgumentOutOfRangeException

      因为您尝试访问列表中尚不存在的项目。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-05-03
        • 2013-11-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多