Duplicata possible: Listes C # à initialisation automatique
J'ai une liste d'entiers qui a une certaine capacité que je voudrais remplir automatiquement une fois déclarée.
List<int> x = new List<int>(10);
Existe-t-il un moyen plus simple de remplir cette liste avec 10 entiers qui ont la valeur par défaut pour un int plutôt que de boucler et d'ajouter les éléments?
Réponses
Trop de publicités?Eh bien, vous pouvez demander à LINQ de faire le bouclage pour vous:
List<int> x = Enumerable.Repeat(value, count).ToList();
On ne sait pas si par "valeur par défaut" vous entendez 0 ou une valeur par défaut personnalisée.
Vous pouvez rendre cela légèrement plus efficace (en temps d'exécution; c'est pire en mémoire) en créant un tableau:
List<int> x = new List<int>(new int[count]);
Cela fera une copie en bloc du tableau dans la liste, ce qui sera probablement plus efficace que le bouclage requis par ToList
.
si vous avez une liste de longueur fixe et que vous voulez que tous les éléments aient la valeur par défaut, vous devriez peut-être simplement utiliser un tableau:
int[] x = new int[10];
Sinon, cela peut être un bon endroit pour une méthode d'extension personnalisée:
public static void Fill<T>(this ICollection<T> lst, int num)
{
Fill(lst, default(T), num);
}
public static void Fill<T>(this ICollection<T> lst, T val, int num)
{
lst.Clear();
for(int i = 0; i < num; i++)
lst.Add(val);
}
et vous pouvez même ajouter une surcharge spéciale pour que la classe List se remplisse jusqu'à la capacité:
public static void Fill<T>(this List<T> lst, T val)
{
Fill(lst, val, lst.Capacity);
}
public static void Fill<T>(this List<T> lst)
{
Fill(lst, default(T), lst.Capacity);
}
Ensuite, vous pouvez simplement dire:
List<int> x = new List(10).Fill();
var count = 10;
var list = new List<int>(new int[count]);
AJOUTER
Voici une méthode générique pour obtenir la liste avec les valeurs par défaut:
public static List<T> GetListFilledWithDefaulValues<T>(int count)
{
if (count < 0)
throw new ArgumentException("Count of elements cannot be less than zero", "count");
return new List<T>(new T[count]);
}