Cela ressemble à ce que vous voulez est de retrouver avec tableaux contenant les seconds éléments des tableaux 2D, regroupés par le premier élément . Donc, étant donné votre exemple, vous voulez obtenir des résultats comme celui-ci:
Iteration 1a: {"1", "b", "b", "b"}
Iteration 1b: {"b", "c", "c", "c"}
Iteration 2a: {"2", "b", "b", "e"}
Iteration 2b: {"b", "c", "c", "d"}
Il faut comprendre que cela ne peut être réalisé de manière efficace, car un tableau 2D ne sont pas stockées sous forme de plusieurs tableaux, mais plutôt comme un bloc unique de la mémoire. En mémoire, votre tableau regardera ce ceci:
"1", "b", "b", "b", "b", "c", "c", "c", "2", "b", "b", "e", "b", "c", "c", "d"
Et lorsque vous accédez avec a[y, x]
, l'élément correct est choisi par y * a.GetLength(0) + x
.
Si vous voulez vraiment un tableau de tableaux, alors vous devriez utiliser [][]
au lieu de [,]
, ce que d'autres ont suggéré. Si, d'autre part, vous êtes bloqué avec le tableau multidimensionnel pour d'autres raisons, vous devrez construire ou simuler les tableaux internes.
Pour construire les réseaux internes:
foreach(string[,] square in cross)
for(int y = 0; y < square.GetUpperBound(0); y++){
string[] inner = new string[square.GetLength(1)];
for(int x = 0; x < inner.Length; x++)
inner[x] = square[y, x];
// now do something with inner
}
qui est assez inefficace, mais, si vous êtes mieux faire semblant. Si vous ne devez itérer plus tard, alors vous pouvez créer un dénombrable:
foreach(string[,] square in cross)
for(int y = 0; y < square.GetUpperBound(0); y++){
var inner = GetEnumeratedInner(square, y);
// now do something with inner
}
...
static IEnumerable<string> GetEnumeratedInner(string[,] square, int y){
for(int x = 0; x < square.GetUpperBound(1); x++)
yield return square[y, x];
}
Si vous avez vraiment besoin d'y accéder par index, comme vous pouvez avec un tableau, puis une classe indexée fera l'affaire:
foreach(string[,] square in cross)
for(int y = 0; y < square.GetUpperBound(0); y++){
var inner = new IndexedInner(square, y);
// now do something with inner
}
...
// this class should really implement ICollection<T> and System.Collections.IList,
// but that would be too much unimportant code to put here
class IndexedInner<T> : IEnumerable<T>{
T[,] square;
int y;
public IndexedInner(T[,] square, int y){
this.square = square;
this.y = y;
}
public int Length{get{return square.GetLength(1);}}
public T this[int x]{
get{return square[y, x];}
set{square[y, x] = value;}
}
public IEnumerator<T> GetEnumerator(){
for(int x = 0; x < square.GetUpperBound(1); x++)
yield return square[y, x];
}
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator(){
return GetEnumerator();
}
}
Vous avez actuellement un tableau en dents de scie de tableaux 2D. ** –
Je suggère d'utiliser une liste d'objets ou des chaînes au lieu du tableau 3D, serait plus facile à itérer – Gage