C# les lignes des matrices multi-dimensionnelles
Dans le langage de programmation C#, comment puis-je passer une ligne d'un tableau multidimensionnel? Par exemple, supposons que j'ai le texte suivant:
int[,] foo;
foo = new int[6,4];
int[] least;
least = new int[6];
for(int i = 0; i < 6; i++)
{
least[i] = FindLeast(ref foo[i]); //How do I pass the ith row of foo???
}
Aussi, quelqu'un pourrait-il m'expliquer l'avantage d'avoir rectangulaire, et dont les tableaux en C#? Cela se produit dans d'autres langages de programmation communs? (Java?)
Merci pour toute l'aide!
OriginalL'auteur CodeKingPlusPlus | 2012-03-06
Vous devez vous connecter pour publier un commentaire.
Vous ne pouvez pas passer une ligne d'une matrice rectangulaire, vous devez utiliser un tableau en escalier (un tableau de tableaux):
MODIFIER
Si vous trouvez qu'il est si ennuyeux d'utiliser un tableau en escalier et ont désespérément besoin d'une forme rectangulaire, une simple astuce va vous sauver:
Non, vous ne pouvez pas
Donc, fondamentalement, ce n'est pas une solution 🙂
OriginalL'auteur BlackBear
Vous ne le faites pas, avec un rectangulaire array comme ça. C'est un objet unique.
Au lieu de cela, vous devez utiliser un irréguliers array, comme ceci:
Puis vous pouvez passer chaque "sous"-tableau:
Noter qu'il n'y a pas besoin de passer
foo[i]
par référence1, et aussi c'est une bonne idée pour affecter les valeurs des variables locales au moment de la déclaration, lorsque vous le pouvez. (Il rend votre code plus compact et plus simple à comprendre.)1 Si vous n'êtes pas sûr à ce sujet, vous pouvez lire mon article sur passage de paramètres en C#.
Puis-je passer d'une matrice rectangulaire comme un tableau en escalier?
Cela, pour moi, ressemble à une non-solution. Ce qui peut être fait dans le cas d'une matrice rectangulaire?
Rien, en fait. La réponse à la question est "vous ne pouvez pas le faire". C'est peut-être pas répondre à l'OP veut entendre, mais c'est la bonne réponse.
Vous ne pouvez pas passer comme un tableau, qui est ce que l'OP semble être à la recherche pour. Vous pouvez créer votre propre wrapper type, mais il n'y a aucune indication que cela permettrait d'aider les OP. Toutefois, si vous pensez que vous avez une meilleure réponse, pourquoi ne pas l'ajouter vous-même?
OriginalL'auteur Jon Skeet
Mise à jour: Jon Skeet souligne à juste titre, ce qui ne donne pas référence à la ligne, mais plutôt crée une nouvelle copie. Si votre code doit changement une ligne, cette méthode ne fonctionne pas. J'ai renommé la méthode pour le faire comprendre.
Mise à jour 2: Si vous voulez être en mesure de modifier les champs, et les changements se produisent à la société mère tableau, trop, vous pouvez utiliser le wrapper-je fournir à l' cette bibliothèque je maed. L'résultant de la ligne
foo.Row(i)
n'est pas un tableau, mais met en œuvreIList
, donc si vous besoin pour passer un tableau ce n'est pas une solution non plus.Cette extension vous permettra d'interroger un tableau multidimensionnel pour les lignes. Il convient de noter que c'est mathématiquement lourde (pas efficace) et si il est possible vous devez utiliser un tableau en escalier pour ces situations. Si, toutefois, vous vous trouvez dans une situation où vous ne pouvez pas utiliser un tableau en escalier, ce qui peut être utile.
Votre code peut être réécrit:
FindLeast
modifie le tableau, alors que la modification ne sera pas visible dans le résultat. En outre, le résultat defoo.Row(i)
n'est pas classé comme une variable, de sorte que le code ne compile pas. Il vous suffit de pas traiter un tableau rectangulaire comme si c'était un tableau en escalier - tableaux ne fonctionne pas comme ça.Je ne comprends pas votre commentaire à propos de la compilation. Le code s'exécute et compile.
Vous avez absolument raison! Ce ne passant pas par une référence à une ligne (qui ne peut pas être fait). En supposant que
FindLeast
ne modifie pas la ligne, cela devrait fonctionner. Je vais renommer la méthode, bien 🙂Il peut résoudre les OP
FindLeast
exemple, mais il ne pas adresse de la question plus générale de passage d'une seule rangée d'un tableau rectangulaire comme un seul tableau multidimensionnel, qui est (comme je le dis toujours) impossible.Je pense que c'est implicite, pour être honnête. "Passer d'une ligne d'un tableau multidimensionnel" et "transmettre une copie d'une ligne d'un tableau multidimensionnel" sont deux choses différentes. Je pense que c'est beaucoup plus clair de dire "Vous ne pouvez pas passer une ligne" que de prétendre que vous le pouvez, et en fait il suffit de passer une copie. Je maintiens que la meilleure réponse à la discussion de la question est "vous ne pouvez pas".
OriginalL'auteur Niels Abildgaard