33 votes

Initialisation du tableau C # - avec une valeur non par défaut

Quelle est la manière la plus simple d'initialiser un tableau de taille dynamique en C # que vous connaissez?

C'est le mieux que j'ai pu trouver

 private bool[] GetPageNumbersToLink(IPagedResult result)
{
   if (result.TotalPages <= 9)
      return new bool[result.TotalPages + 1].Select(b => true).ToArray();

   ...
 

Merci!

Rob

74voto

Nigel Touch Points 1016

Si par «le plus lisse» vous voulez dire le plus rapide, je crains que Enumerable.Repeat soit 20 fois plus lent qu'une boucle for . Voir http://dotnetperls.com/initialize-array :

 Initialize with for loop:             85 ms  [much faster]
Initialize with Enumerable.Repeat:  1645 ms
 

Utilisez donc la méthode SetAllValues () de Dotnetguy.

38voto

Mark Cidade Points 53945

utilisez Enumerable.Repeat

 Enumerable.Repeat(true, result.TotalPages + 1).ToArray()
 

14voto

Neil Hewitt Points 2163

EDIT: comme un intervenant l'a souligné, de mon origine de la mise en œuvre n'a pas fonctionné. Cette version fonctionne, mais est plutôt de l'onu-slick basées autour d'une boucle for.

Si vous êtes prêt à créer une extension de la méthode, vous pouvez essayer ce

public static T[] SetAllValues<T>(this T[] array, T value) where T : struct
{
    for (int i = 0; i < array.Length; i++)
        array[i] = value;

    return array;
}

et ensuite appeler comme ça

bool[] tenTrueBoolsInAnArray = new bool[10].SetAllValues(true);

Comme alternative, si vous êtes heureux avec le fait d'avoir une classe de traîner, vous pouvez essayer quelque chose comme cela

public static class ArrayOf<T>
{
    public static T[] Create(int size, T initialValue)
    {
        T[] array = (T[])Array.CreateInstance(typeof(T), size);
        for (int i = 0; i < array.Length; i++)
            array[i] = initialValue;
        return array;
    }
}

qui vous pouvez l'appeler comme les

bool[] tenTrueBoolsInAnArray = ArrayOf<bool>.Create(10, true);

Vous ne savez pas lequel je préfère, bien que je ne lurv les méthodes d'extension des lots et des lots en général.

5voto

Nick Aceves Points 949

Je suggérerais en fait ceci:

 return Enumerable.Range(0, count).Select(x => true).ToArray();
 

De cette façon, vous allouez un seul tableau. Il s'agit essentiellement d'une manière plus concise d'exprimer:

 var array = new bool[count];

for(var i = 0; i < count; i++) {
   array[i] = true;
}

return array;
 

0voto

Matt Hamilton Points 98268

Non testé, mais pourriez-vous simplement faire cela?

 return result.Select(p => true).ToArray();
 

Vous sautez la partie "new bool []"?

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