75 votes

Pourquoi les tableaux multidimensionnels C # n'implémentent-ils pas IEnumerable? <T> ?

J'ai juste remarqué qu'un tableau multidimensionnel en C#, ne pas mettre en oeuvre IEnumerable<T>, alors qu'il n'en œuvre IEnumerable. Pour unique dimensions des tableaux, à la fois IEnumerable<T> et IEnumerable sont mis en œuvre.

Pourquoi cette différence? Si un tableau multidimensionnel est - IEnumerable, sûrement, il devrait également mettre en œuvre la version générique? Je l'ai remarqué parce que j'ai essayé d'utiliser une méthode d'Extension sur un tableau multidimensionnel, qui ne parvient pas, sauf si vous utilisez Cast<T> ou similaires; donc, je peux certainement voir l'un argument pour rendre les tableaux multidimensionnels mettre en oeuvre IEnumerable<T>.

Pour préciser ma question dans le code, j'attendrais le code suivant pour imprimer true quatre fois, alors qu'il fait des tirages true, false, true, true:

int[] singleDimensionArray = new int[10];
int[,] multiDimensional = new int[10, 10];

Debug.WriteLine(singleDimensionArray is IEnumerable<int>);
Debug.WriteLine(multiDimensional is IEnumerable<int>);
Debug.WriteLine(singleDimensionArray is IEnumerable);
Debug.WriteLine(multiDimensional is IEnumerable);

51voto

Jon Skeet Points 692016

Le CLR a deux différents types de tableaux: les vecteurs qui sont garantis d'être unidimensionnel avec une limite inférieure de 0, et plus généralement des tableaux qui peuvent non nulle de limites et d'un grade autre que 0.

À partir de la section 8.9.1 de la CLI spec:

En outre, un vecteur avec type d'élément de T, met en œuvre la interface System.Collections.Generic.IList<U> (§8.7), où U := T.

Je dois dire que cela me semble assez bizarre pour moi. Étant donné qu'il implémente déjà IEnumerable je ne vois pas pourquoi il ne devrait pas mettre en oeuvre IEnumerable<T>. Il ne fera pas autant de sens à mettre en oeuvre IList<T>, mais la simple interface générique, ce serait bien.

Si vous voulez cela, vous pouvez soit appeler Cast<T> (si vous êtes en utilisant .NET 3.5) ou écrire votre propre méthode pour parcourir le tableau. Pour éviter de jeter, vous devriez écrire votre propre méthode qui a trouvé inférieure/limite supérieure de chaque dimension, et a obtenu les choses de cette façon. Pas très agréable.

18voto

Jader Dias Points 23461

Il existe une solution de contournement: vous pouvez convertir n’importe quel tableau multidimensionnel en un IEnumerable.

 public static class ArrayExtensions
{
    public static IEnumerable<T> ToEnumerable<T>(this Array target)
    {
        foreach (var item in target)
            yield return (T)item;
    }
}
 

4voto

Konrad Rudolph Points 231505

Les tableaux multidimensionnels sont pas des tableaux pour le but de la hiérarchie d'héritage. Ils sont un tout autre type. En outre, ce type n'a pas un bon soutien de la cadre pour deux raisons possibles:

  • Ce n'est pas vraiment utile. La seule réelle utilité pour les tableaux multidimensionnels est de matrices. Pour presque n'importe quoi d'autre, d'autres structures de données (par exemple, les tableaux irréguliers) sont mieux adaptés.
  • Il n'est pas trivial pour concevoir des génériques, les méthodes utiles pour ces structures.

Dans le cas d' IEnumerable, comment ont été mises en œuvre, c'est à dire dans quel ordre les éléments énumérés? Il n'y a pas d'ordre inhérent dans les tableaux multidimensionnels.

1voto

Matthew Scharley Points 43262

Les tableaux irréguliers ne prennent pas en charge IEnumerable<int> , parce que les structures multidimensionnelles n'est pas vraiment un tableau d'un type, ils sont un tableau d'un tableau du type:

int[] singleDimensionArray = new int[10];
int[][] multiJagged = new int[10][];

Debug.WriteLine(singleDimensionArray is IEnumerable<int>);
Debug.WriteLine(multiJagged is IEnumerable<int[]>);
Debug.WriteLine(singleDimensionArray is IEnumerable);
Debug.WriteLine(multiJagged is IEnumerable);

Imprime true, true, true, true.

Remarque: int[,] n'est pas un IEnumerable<int[]>, c'est pour les raisons prévues à l'autre réponse, à savoir il n'y a pas de méthode générique permettant de connaître la dimension à parcourir. Avec les tableaux irréguliers, il n'y a pas autant de place à l'interprétation, car la syntaxe est assez clair à ce sujet étant un tableau de tableaux.

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