Проанализировать массив объектов самым простым способом? - PullRequest
2 голосов
/ 17 февраля 2012

Для данного класса:

class clsPerson { public int x, y; }

Есть ли какой-нибудь способ создать массив этих классов с каждым элементом, инициализированным для созданного (по умолчанию) экземпляра, не делая это вручную в цикле for, как:1004 *

clsPerson[] objArr = new clsPerson[1000];

for (int i = 0; i < 1000; ++i)
    objArr[i] = new clsPerson();

Можно ли сократить объявление и создание экземпляра массива из N объектов?

Ответы [ 3 ]

13 голосов
/ 17 февраля 2012

Конструктор должен быть запущен для каждого элемента в массиве в этом сценарии. Независимо от того, используете ли вы цикл, инициализаторы коллекции или вспомогательный метод, каждый элемент в массиве должен быть посещен.

Если вы просто ищете удобный синтаксис, вы можете использовать следующее

public static T[] CreateArray<T>(int count) where T : new() {
  var array = new T[count];
  for (var i = 0; i < count; i++) {
    array[i] = new T();
  }
  return array;
}

clsPerson[] objArary = CreateArray<clsPerson>(1000);
8 голосов
/ 17 февраля 2012

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

Вы можете сократить его (чуть-чуть) из цикла, используя:

clsPerson[] objArr = Enumerable.Range(0, 1000).Select(i => new clsPerson()).ToArray();

Лично я бы все равно выделил массив и прошел по нему (и / или переместил бывспомогательная рутина), хотя, как это очень ясно и все еще довольно просто:

clsPerson[] objArr = new clsPerson[1000];
for (int i=0;i<1000;++i) 
   clsPerson[i] = new clsPerson(); 
0 голосов
/ 17 февраля 2012

Если это имеет смысл, вы можете изменить class clsPerson на struct Person. struct s всегда имеет значение по умолчанию.

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