Comment puis-je "foreach" au travers d'un tableau à deux dimensions?
J'ai un tableau à deux dimensions,
string[,] table = {
{ "aa", "aaa" },
{ "bb", "bbb" }
};
Et j'aimerais foreach
long comme ça,
foreach (string[] row in table)
{
Console.WriteLine(row[0] + " " + row[1]);
}
Mais, j'obtiens l'erreur:
Ne peut pas convertir en chaîne de type string[]
Est-il un moyen que je puisse réaliser ce que je veux, c'est à dire parcourir la première dimension du tableau avec la variable d'itérateur de retour moi le tableau unidimensionnel pour cette ligne?
- Astuce: string[,] != string[][]
Vous devez vous connecter pour publier un commentaire.
Si vous définissez votre tableau comme ceci:
Ensuite, vous pouvez utiliser une boucle foreach sur elle.
Tableaux multidimensionnels ne sont pas énumérable. Juste réitérer la bonne vieille méthode qui consiste à:
Comme d'autres l'ont suggéré, vous pouvez utiliser imbriqués pour des boucles ou redeclare votre tableau multidimensionnel comme dentelés un.
Cependant, je pense qu'il est intéressant de souligner que les tableaux multidimensionnels sont énumérable, tout simplement pas de la manière que vous voulez. Par exemple:
Mise à JOUR: j'ai eu un peu de temps sur mes mains, alors ... je suis allé de l'avant et de matérialiser cette idée. Voir ci-dessous pour le code.
Ici est un peu fou réponse:
Vous pourrait faire ce que vous êtes à la recherche pour-essentiellement de traiter un tableau à deux dimensions, comme un tableau avec des lignes -- par l'écriture d'une méthode statique (peut-être une méthode d'extension) qui prend un
T[,]
et renvoie unIEnumerable<T[]>
. Cela nécessiterait la copie de chaque "ligne" de la table sous-jacente dans un nouveau tableau, si.Un peut-être mieux (mais plus impliqués) approche serait d'écrire une classe qui implémente
IList<T>
comme un wrapper autour d'une seule "ligne" d'un tableau à deux dimensions (vous auriez probablementIsReadOnly
de vrai et de juste mettre en œuvre le getter pour lethis[int]
propriété et probablementCount
etGetEnumerator
; tout le reste pourrait jeter uneNotSupportedException
). Ensuite, votre statique/extension de la méthode pourrait retourner unIEnumerable<IList<T>>
et de fournir l'exécution différée.Cette façon, vous pouvez écrire du code un peu comme ce que vous avez:
Juste une pensée.
Mise en œuvre suggestion:
...maintenant je pense que je devrais donner StackOverflow une pause pour le reste de la journée 😉
Cela dépend de comment vous définissez vos tableaux multi-dimensionnels. Voici deux options:
À l'aide de LINQ, vous pouvez le faire comme ceci:
De cette manière, il est également possible d'utiliser un foreach pour parcourir les colonnes au lieu des lignes à l'aide de Index2 à l'égard du Groupe au lieu de l'Indice 1. Si vous ne connaissez pas la dimension de votre tableau, alors vous devez utiliser la méthode GetLength() pour déterminer la dimension et utiliser cette valeur dans le quotient.
Ici est une simple extension de la méthode qui retourne chaque ligne comme un
IEnumerable<T>
. Ceci a l'avantage de ne pas utiliser toute la mémoire supplémentaire:Exemple d'utilisation:
Se rappeler qu'un tableau multidimensionnel est comme un tableau. Vous n'avez pas de x et un y de l'élément pour chaque entrée, vous avez une chaîne (par exemple)
table[1,2]
.Ainsi, chaque entrée est une chaîne de caractères (dans votre exemple), c'est juste une entrée à un x/y de la valeur. Donc, pour obtenir les deux entrées à
table[1, x]
, vous feriez un imbriqués pour la boucle. Quelque chose comme ce qui suit (pas testé, mais il devrait être proche)J'ai essayer cette. J'espère que pour aider les. Il travail avec
Je ne suis pas un grand fan de cette méthode en raison de l'utilisation de la mémoire impliqués, mais si vous utilisez les tableaux qu'il produit, il n'est pas un déchet.
Mise en œuvre:
L'autre solution que j'ai trouvé est moins gourmande en mémoire, mais l'utilisation de plus de CPU, en particulier lorsque les dimensions des tableaux entrées sont plus grandes.
Mise en œuvre:
Comme un ensemble, je trouve la première option pour être plus intuitive, surtout si vous souhaitez accéder à la table produite par son indexation.
À la fin de la journée, c'est tous simplement des bonbons pour les yeux, ni les méthodes devrait vraiment être utilisé en faveur de l'accès direct de la source matrice;