Как создать список класса в другом классе? - PullRequest
0 голосов
/ 16 мая 2019

Я имею дело со следующей структурой классов:

 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: 'Индекс был вне диапазона.Должен быть неотрицательным и меньше размера коллекции.

Буду очень признателен, если кто-нибудь сможет помочь мне найти мою ошибку.

Ответы [ 5 ]

2 голосов
/ 16 мая 2019

Ну, строка

 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;
  } 
}  
1 голос
/ 16 мая 2019

Класс C1 будет хранить целое число, без проблем.

Класс C2 будет хранить Список из С1 объектов.Он создается при объявлении, давая ему размер 10. Будьте осторожны: он по-прежнему пуст, независимо от установленного вами размера.

Итак, грязное заполнение в конструкторе C2 будетправильно поднять исключение.См. Рабочий код:

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

. Как подсказал Дмитрий, было бы гораздо лучше использовать подход Linq .

On btn_Click метод, вы делаете ту же ошибку.Список lRes правильно инициализирован и имеет размеры, но все еще пустой.Таким образом, вы должны применить то же исправление, что и раньше:

lRes.Add(new C2(lNumbers);
1 голос
/ 16 мая 2019

Это потому, что вы делаете Row < 5, но есть 6 из этих строк Series[0] = new C1(lNumbers[0]);

Так что Series[5] = new C1(lNumbers[5]); вне индекса вызывает эту ошибку?

РЕДАКТИРОВАТЬ: Такжеэта строка неверна в OP.

List<**C2**> lRes = new List<**C1**>(5);
1 голос
/ 16 мая 2019

Ваш код сбивает с толку (по крайней мере, для меня).Но первое, что я хотел бы изменить, - это способ «добавления» элементов в список.Вы должны использовать метод Add для добавления элементов в ваш список.Также нет причин создавать новый список lNumbers каждый для повторения.

1 голос
/ 16 мая 2019

Series - это список элементов C1, я бы использовал Series.Add () вместо этого в Series [0], [1] и т. Д., Или вы в основном используете список, как если бы это был массив

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...