Comment copier une rangée de valeurs d'un tableau 2D dans un tableau 1D?
Nous avons l'objet suivant
int [,] oGridCells;
qui est utilisé uniquement avec un premier indice
int iIndex = 5;
for (int iLoop = 0; iLoop < iUpperBound; iLoop++)
{
//Get the value from the 2D array
iValue = oGridCells[iIndex, iLoop];
//Do something with iValue
}
Est-il un moyen dans .NET pour convertir les valeurs fixe à un premier indice dans un tableau unidimensionnel (autres que par le bouclage des valeurs)?
Je doute qu'il permettrait d'accélérer le code (et il se pourrait bien le rendre plus lent) si le tableau n'est bouclée une fois. Mais si le tableau a été fortement manipulé puis une seule dimension de la matrice serait plus efficace qu'un multi dimension de la matrice.
Ma principale raison de poser la question est de voir si cela peut être fait et comment le faire, plutôt que de l'utiliser pour la production de code.
source d'informationauteur stevehipwell | 2009-04-28
Vous devez vous connecter pour publier un commentaire.
Le code suivant montre la copie 16 octets (4 ints) à partir d'un 2-D tableau 1-D tableau.
Vous pouvez également sélectivement copie juste 1 ligne de la matrice en fournissant l'octet correct des décalages. Cet exemple des copies de la rangée du milieu, une ligne de 3 2-D tableau.
Edit:
J'ai réalisé il y a un moyen! Certes, c'est probablement pas la peine. Utilisation le code unsafe. Exemple complet, montrant à la fois les façons, avec un ci-dessous:
Il n'y a aucun moyen que je connaisse pour jeter des multiples dimensions de tableau en une seule-dimensionnel en C#. Bien sûr, vous pouvez créer un nouveau tableau multidimensionnel et copiez-il. Mais je ne pense pas que cela va obtenir un avantage en matière de performances, même si vous avez une boucle sur les valeurs à plusieurs reprises. Comme Daren dit, à l'interne, c'est tout l'arithmétique des pointeurs de toute façon. Si vous voulez être certain profil.
Vous ne pouvez pas obtenir une référence à chaque tableau. Vous pouvez, cependant, utiliser un tableau en escalier.
"Mais si le tableau a été fortement manipulé puis une seule dimension de la matrice serait plus efficace qu'un multi dimension du tableau."
J'ai fait un peu de profilage de exactement l'été dernier, et a été surpris de voir pas de différence significative de performance entre 2D et 1D tableau.
Je n'ai pas tester les performances d'un tableau en escalier.
Vous pouvez essayer ceci:
Le résultat sera un tableau d'entiers avec des données:
Je serais surpris si c'était possible: je parie
oGridCells[iIndex, iLoop]
est juste une sorte de raccourci (en interne, en MSIL) pouroGridCells[iIndex * iLoop]
et que les tableaux multidimensionnels sont sucre syntaxique pour cela.Pour répondre à votre question: Non. Vous aurez à boucle les valeurs.