Как элегантно заполнить гетерогенный массив в C # - PullRequest
0 голосов
/ 03 февраля 2019

У меня есть 3 разных класса (1 родитель и 2 ребенка), и я создал гетерогенный массив:

Parent[] parentArray =  new Parent[9];

Я хотел бы заполнить этот массив 3 родительскими объектами, 3 дочерними объектами1 и3 объекта child2, в этом порядке.

Я хотел бы знать, есть ли более элегантный способ сделать это, чем просто сделать это:

parentArray[0] = new Parent();

parentArray[1] = new Parent();

parentArray[2] = new Parent();

parentArray[3] = new Child1();

parentArray[4] = new Child1();

....

parentArray[9] = new Child2();

Спасибо!

Ответы [ 3 ]

0 голосов
/ 03 февраля 2019

В этой ситуации вы хотите выполнить определенное количество действий повторно.Петли обычно используются для этого.Поскольку вы инициализируете массив, циклы for хорошо подходят, так как они предоставляют целое число, которое можно использовать для индексации массива.В вашем сценарии вы можете использовать три таких цикла.

Parent[] parentArray = new Parent[9];

for (int i = 0; i < 3; i++)
{
    parentArray[i] = new Parent();
}

for (int i = 3; i < 6; i++)
{
    parentArray[i] = new Child1();
}

for (int i = 6; i < 9; i++)
{
    parentArray[i] = new Child2();
}
0 голосов
/ 03 февраля 2019

Лично я просто думаю, что вы должны использовать инициализатор объекта.Однако для чистой скуки вы можете использовать Linq и общий фабричный метод.

// Given
public static IEnumerable<T> Factory<T>(int count) where T : Parent, new() 
     => Enumerable.Range(0, count).Select(x => new T());

...

// Usage
var array = Factory<Parent>(3)
              .Union(Factory<Child1>(3))
              .Union(Factory<Child2>(3))
              .ToArray();
0 голосов
/ 03 февраля 2019

Как это?

var parentArray = new Parent[]
{
    new Parent(),
    new Parent(),
    new Parent(),
    new Child1(),
    ...
};
...