2009-12-04 5 views
1

Comment créer une structure de données multidimensionnelle en C#?Structures de données multidimensionnelles en C#

Dans mon esprit, il fonctionne comme ceci:

List<List<int>> results = new List<List<int>>(); 
    for (int i = 0; i < 10; i++) 
    { 
     for (int j = 0; j < 10; j++) 
     { 
      results[i][j] = 0; 
     } 
    } 

Cela ne fonctionne pas (il jette un ArgumentOutOfRangeException). Y a-t-il une structure multidimensionnelle en C# qui me permet d'accéder aux membres à travers leurs index?

+0

Que voulez-vous dire "ne fonctionne pas"? –

+0

Probablement "déclenche une exception car l'élément référencé n'existe pas." –

+0

Il se bloque et dit qu'il est hors de portée –

Répondre

0

Vous pouvez utiliser une datatable et ajouter des colonnes et des lignes? Vous seriez alors en mesure de les référencer par nom ou par index.

2

Vous devez créer les listes et les initialiser avec des zéros avant de pouvoir commencer à les indexer.

List<List<int>> results = new List<List<int>>(); 

    for (int i = 0; i < 10; i++) 
    { 
     results.Add(new List<int>(Enumerable.Repeat(0, 10))); 
    } 
2

Vous devez en réalité 1) créer chacune des listes internes, et 2) les définir à cette taille.

var Results = Enumerable.Range(0, 10).Select(i => Enumerable.Repeat(0, 10).ToList()).ToList(); 

Je suis un peu accro à Linq.

+0

Moi aussi :-). C'est ma façon préférée de le faire, alors je l'ai ajouté à ma réponse.Quelle est cette chose pour tout le monde continue à utiliser? : 0) – Zooba

10

Le problème ici est que List ne crée pas automatiquement les éléments. Pour initialiser un List<List<T>> dont vous avez besoin quelque chose comme ceci:

List<List<int>> results = new List<List<int>>(); 

for (int i = 0; i < 10; i++) 
{ 
    results.Add(new List<int>()); 
    for (int j = 0; j < 10; j++) 
    { 
     results[i].Add(0); 
    } 
} 

Notez que la mise en Capacity ne suffit pas, vous devez appeler Add le nombre de fois que vous avez besoin. Vous pouvez simplifier les choses en utilisant Enumerable classe Linq:

List<List<int>> results = new List<List<int>>(); 

for (int i = 0; i < 10; i++) 
{ 
    results.Add(new List<int>()); 
    results[i].AddRange(Enumerable.Repeat(0, 10)); 
} 

Encore une fois, notez que Enumerable.Repeat(new List<int>(), 10) ne fonctionnera pas, car il ajoutera 10 références à la même liste.

Une autre approche LINQ à l'extrême:

List<List<int>> results = Enumerable.Repeat(0, 10) 
    .Select(i => Enumerable.Repeat(0, 10).ToList()) 
    .ToList(); 

(. Le paramètre utilisé i est nécessaire pour assurer que vous ne faites pas référence la même liste dix fois discuté ci-dessus)

Enfin, Pour accéder aux éléments, vous pouvez utiliser exactement la notation que vous avez utilisée auparavant. Une fois que les éléments ont été ajoutés, ils peuvent être lus ou modifiés comme indiqué:

for (int i = 0; i < 10; i++) 
{ 
    for (int j = 0; j < 10; j++) 
    { 
     results[i][j] = 2; 
     int x = results[i][j]; 
    } 
} 
+0

J'ai besoin d'une structure dynamique, en l'initialisant à l'avance ne travaillera pas ... –

+0

Eh bien, soit vous incluez le code pour vous assurer d'avoir suffisamment d'éléments déjà ajoutés avant d'y accéder, ou vous utilisez 'Dictionary > '. – Zooba

3

Si vous connaissez les dimensions de votre structure à l'avance, et vous ne prévoyez pas d'ajouter ou de supprimer des éléments, puis un des sons de tableau 2D comme votre chose:

int[,] n = new int[10, 20]; 
for (int i = 0; i < 10; ++i) { 
    for (int j = 0; j < 10; ++j) { 
     n[i, j] = ... 
    }; 
}; 
Questions connexes