【问题标题】:How to create a list of class in another class?如何在另一个班级中创建班级列表?
【发布时间】:2019-05-16 08:35:13
【问题描述】:

我正在处理以下类结构:

 internal class C1
{
    private static readonly int iMinVal = 1;
    private static readonly int iMaxVal = 100;
    public readonly int Number;

    public C1(int iNum)
    {
        if (iNum < iMinVal || iNum > iMaxVal)
            throw new OverflowException();
        this.Number = iNum;
    }
}

internal partial class C2
{
    public readonly List<C1> Series = new List<C1>(10);

    public C2(List<int> lNumbers)
    {
        lNumbers.Sort();

        try
        {
            Series[0] = new C1(lNumbers[0]);
            Series[1] = new C1(lNumbers[1]);
            Series[2] = new C1(lNumbers[2]);
            Series[3] = new C1(lNumbers[3]);
            Series[4] = new C1(lNumbers[4]);
            Series[5] = new C1(lNumbers[5]);
            Series[6] = new C1(lNumbers[6]);
            Series[7] = new C1(lNumbers[7]);
            Series[8] = new C1(lNumbers[8]);
            Series[9] = new C1(lNumbers[9]);
        }
        catch (OverflowException)
        {
            MessageBox.Show("M1!","M2");
            throw;
        }
    }

我尝试通过以下方式使用这两个类:

private void btn_Click(object sender, EventArgs e)
    {
        List<C2> lRes = new List<C2>(5);
        for (int iRow = 0; iRow < 5; iRow++)
        {
            List<int> lNumbers = new List<int> {6, 2, 5, 3, 1, 4, 10, 8, 7, 9};
            lRes[iRow] = new C2(lNumbers);
        }
    }

但它不起作用。 错误消息说:

System.ArgumentOutOfRangeException: '索引超出范围。一定是 非负数且小于集合的大小。

如果有人能帮助我找出我的错误,我将不胜感激。

【问题讨论】:

  • List&lt;C2&gt; lRes = new List&lt;C1&gt;(5); 这甚至可以编译吗? C1C2 之间没有继承关系
  • new C1(lNumbers); List<int> 类型的构造函数。
  • 是的。你说的对。我只是编辑我的代码。这些错误出现在我的代码中,因为我只是更改了原始代码中的名称以简化代码并保护上下文。

标签: c# list class nested


【解决方案1】:

行了

 public readonly List<C1> Series = new List<C1>(10);

表示“创建包含 0 个项目的列表,但 10 个项目保留 空间(为了不重新分配内存)”。 请注意,Series 没有任何项目,这就是原因

 Series[0] = new C1(lNumbers[0]);

将抛出异常(Series[0] 不存在,因为0 超出范围)。您应该Add 项目,例如快速(和肮脏)的补丁

  public C2(List<int> lNumbers) {
    lNumbers.Sort();

    try
    {
        Series.Clear();

        Series.Add(new C1(lNumbers[0])));
        Series.Add(new C1(lNumbers[1]));
        Series.Add(new C1(lNumbers[2]));
        Series.Add(new C1(lNumbers[3]));
        Series.Add(new C1(lNumbers[4]));
        Series.Add(new C1(lNumbers[5]));
    }
    catch (OverflowException)
    {
        MessageBox.Show("M1!","M2");
        throw;
    }
}

更好的方法是 Linq

// IEnumerable<int> - let's generalize: what if we want to pass an array?
public C2(IEnumerable<int> lNumbers) {
  // public method arguments validation
  if (null == lNumbers)  
    throw new ArgumentNullException(nameof(lNumbers));

  try {
    Series = lNumbers
      .OrderBy(item => item) 
      //.Take(10) // uncomment, if you want to take just top 10 items, not more
      .Select(item => new C1(item))
      .ToList();
  }
  catch (OverflowException) {
    MessageBox.Show("M1!","M2");
    throw;
  } 
}  

【讨论】:

    【解决方案2】:

    Series 是 C1 项目的列表,我会在 Series[0]、[1] 等上使用 Series.Add() 代替,或者您基本上使用列表,就好像它是一个数组

    【讨论】:

      【解决方案3】:

      是不是因为你在做Row &lt; 5但是有6行Series[0] = new C1(lNumbers[0]);

      那么索引之外的Series[5] = new C1(lNumbers[5]); 是否会导致该错误?

      编辑:此行在 OP 中也不正确。

      List<**C2**> lRes = new List<**C1**>(5);
      

      【讨论】:

      • 谢谢。我刚刚编辑了代码。自从我更改名称后,这些错误就出现在我的代码中。请您再看看编辑过的代码好吗?
      【解决方案4】:

      您的代码令人困惑(至少对我而言)。 但我要改变的第一件事是您将元素“添加”到列表中的方式。 您应该使用 Add 方法将元素添加到列表中。 也没有理由为每个迭代创建一个新的 List lNumbers。

      【讨论】:

        【解决方案5】:

        C1 类将存储一个整数,这没有问题。

        C2 类将存储 C1 对象的 List。它在声明时实例化,大小为 10。请注意:无论您设置的大小如何,它仍然是空的。

        因此,C2 构造函数上的脏填充将正确引发异常。查看工作代码:

        Series.Add(new C1(lnumber[0]));
        ...
        Series.Add(new C1(lnumber[9]));
        

        正如 Dmitry 所建议的,使用 Linq 方法会更好。

        btn_Click 方法上,你犯了同样的错误。 lRes 列表已正确初始化和调整大小,但仍为空。因此,您必须应用之前看到的相同修复:

        lRes.Add(new C2(lNumbers);
        

        【讨论】:

          猜你喜欢
          • 2018-07-24
          • 2020-03-15
          • 2017-06-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-11-05
          • 1970-01-01
          相关资源
          最近更新 更多