1
votes

Existe-t-il un moyen simple de créer une liste d'objets identiques sans utiliser de boucle?

J'ai actuellement quelque chose comme ceci:

var persons = new Person[numberOfPersons];

Je sais que si je devais utiliser un tableau alors je pourrais simplement faire ceci:

XXX

Ma question est:

  • Existe-t-il un moyen simple / direct de créer une liste d'objets sans utiliser de boucle?

Je suppose qu'un tableau fait probablement exactement la même chose en interne que d'utiliser une boucle pour créer ce tableau mais avec une notation différente. Mais ce n'est pas un problème pour le moment, pour cette question, je suis juste intéressé par une notation plus simple.


6 commentaires

Cette question m'est difficile à comprendre. Il semble que vous posiez une question (un moyen de créer un certain nombre d'objets identiques sans utiliser de boucle), proposiez une solution (utilisez un tableau), puis prétendiez que la solution n'existe pas. Vous voulez une solution plus simple qu'une boucle qui n'est pas aussi simple qu'un tableau? Ou quoi?


Oui, je dois utiliser une liste et je sais qu'il existe une notation simple pour les tableaux, je voulais savoir s'il existe une manière similaire de créer des listes. Peut-être créer un tableau et le convertir en liste?


Un moyen efficace de créer une List de cette manière est d'utiliser son ctor surchargé qui accepte un IEnumerable , comme ceci: var list = new List (Enumerable.Range (1, 10) .Select (i => new Person ()));


La construction de tableau ne crée pas d'objets, ce n'est donc pas une solution.


Pourquoi ne pas utiliser une boucle? Boucle de boucles. C'est ce qu'ils font. Rester simple.


@BrianRasmussen a tout à fait raison; une boucle est la "manière simple / directe" de faire cela; ce sera aussi le plus efficace. Bien sûr, vous pouvez simuler la même chose de plusieurs façons, mais ... pourquoi? Cela rend juste la syntaxe difficile et laide et l'exécution inefficace, lorsque vous voulez généralement atteindre la lisibilité et les performances (dans cet ordre, généralement)


3 Réponses :


8
votes

Que diriez-vous,

var persons = new List<Person>(numberOfPersons);
for (int i = 0; i < numberOfPersons; i++)
{
    persons.Add(new Person())
}

Vous pouvez aussi faire le plus obtus,

var persons = Enumerable
        .Repeat<Func<Person>>(() => new Person(), numberOfPersons)
        .Select(f => f())
        .ToList();

En fin de compte , Je trouve la boucle for plus facile à comprendre et elle fonctionne plus rapidement.

var persons  = Enumerable.Range(0, numberOfPersons).Select(i => new Person()).ToList();


5 commentaires

@AleksanderRas Je préfère la boucle for , il y a une boucle à l'intérieur de la Range .


Ne devrait-il pas être ToList () au lieu de ToArray () ?


@MarcGravell: Dans la plupart des scénarios du monde réel, cela n'aura pas d'importance en termes de performances globales.


@Sefe c'est étrange, je travaille dans le monde réel, et cela compte de manière mesurable et démontrable dans mes systèmes


@MarcGravell: Ce n'est pas le mien.



1
votes

Vous avez déjà une ligne unique pour construire un tableau, que diriez-vous de le convertir dans la liste que vous voulez?


2 commentaires

mais, ils seront tous null


Oui. Oui, il le feront.



0
votes

Ou vous pouvez utiliser System.Array.ConvertAll , il utilise toujours pour boucle mais vous ne le voyez pas :) ...

var persons = Array.ConvertAll(new Person[30], _ => new Person());


0 commentaires