22 votes

Création d'une liste remplie de nouvelles instances d'un objet

Quelle est la meilleure façon de créer une liste avec un nombre arbitraire d'instances d'un même objet ? c'est-à-dire y a-t-il une façon plus compacte ou plus efficace de faire ce qui suit ?

static List<MyObj> MyObjs = Enumerable.Range(0, 100)
    .Select(i => new MyObj())
    .ToList();

( Enumerable.Repeat me donnerait dix références au même objet, je ne pense donc pas que cela fonctionnerait).

11voto

Gray Points 3117

Modifié pour tenir compte du fait que cette méthode n'est pas travail.

J'étais curieux de savoir ce que vous avez dit à propos de Enumerable.Repeat J'ai donc essayé.

//do not use!
List<object> myList = Enumerable.Repeat(new object(), 100).ToList();

J'ai confirmé qu'ils partagent tous la même référence, comme le mentionne l'OP.

10voto

Josh Points 91

Il ne serait pas difficile de l'implémenter sous la forme d'un itérateur :

IEnumerable<T> CreateItems<T> (int count) where T : new() {
    return CreateItems(count, () => new T());
}

IEnumerable<T> CreateItems<T> (int count, Func<T> creator) {
    for (int i = 0; i < count; i++) {
        yield return creator();
    }
}

4voto

Arithmomaniac Points 1128

Apparemment, la réponse est "non". Merci à tous !

3voto

HankTheTank Points 172

Vous pouvez utiliser l'énumérable comme base et utiliser select pour créer de nouveaux objets :

List<object> myList = Enumerable.Repeat(null, 100).Select(_ => new object()).ToList();

vous pouvez attacher un débogueur, le new est exécuté à chaque fois. C'est presque la même chose que votre code, mais vous n'avez pas besoin de fournir une fausse plage. Vous ne fournissez qu'un null comme faux objet que vous voulez répéter...

2voto

B2K Points 919

Je ne vois pas très bien ce qu'il y a de mal à utiliser une boucle for dans ce cas. Au moins, nous pouvons prédimensionner la capacité de la liste. Ce n'est peut-être pas important pour 100 objets, mais la taille est arbitraire.

public class MyClass
{
    static int Capacity = 100;
    static List<MyObj> MyObjs = new List<MyObj>(Capacity);

    static MyClass() {
       for( var i = 0; i < Capacity; i++ ) {
          MyObjs.Add(new MyObj());
       }
    }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X