2009-12-21 6 views
4

Comment définir une matrice dynamique bidimensionnelle? Si je veux utiliser la liste <>, puis-je l'utiliser pour deux dimensions?Définition de la matrice dynamique bidimensionnelle

+0

s'il vous plaît nous dire votre situation dans plus de détails. Il y a une situation où vous n'avez pas besoin d'un tableau à deux dimensions, mais un dictionnaire ou quelque chose de similaire. – serhio

Répondre

10

Il n'y a pas d'équivalent dynamique intégré des tableaux bidimensionnels que je connais, mais vous pouvez facilement obtenir à peu près la même fonctionnalité.

Définition d'une classe de coordonnées avec cette API:

public class Coordinate : IEquatable<Coordinate> 
{ 
    public Coordinate(int x, int y); 
    public int X { get; } 
    public int Y { get; } 
    // override Equals and GetHashcode... 
} 

Vous pouvez maintenant créer une collection de ces instances Coordinate.

Si vous créez un HashSet<Coordinate> vous serez garanti que vous ne pouvez pas ajouter une coordonnée si elle est déjà ajoutée parce qu'elle remplace Equals.

Si vous le souhaitez, vous pouvez étendre Coordinate à Coordinate<T> comme ceci:

public class Coordinate<T> //... 
{ 
    // previous stuff... 

    public T Item { get; set; } 
} 

Cela vous permettra d'associer un élément fortement typé avec chaque coordonnée, comme ceci:

var items = new HashSet<Coordinate<string>>(); 
items.Add(new Coordinate<string>(1, 4) { Item = "Foo" }); 
items.Add(new Coordinate<string>(7, 19) { Item = "Foo" }); 
// ... 
+0

Hey j'aime ça :) –

+1

J'ai essayé cette solution et je ne sais pas si c'est parce que les choses ont changé dans les nouvelles versions de C# mais ce sont les erreurs que je reçois.''Coordinate' n'implémente pas l'interface member'IEquatable .Equals (Coordinate) '' ainsi' 'Coordinate.Coordinate (int, int)' doit déclarer un corps car il n'est pas marqué abstract, extern ou partial' avec 'utiliser le type générique 'Coordinate <>' nécessite 1 argument de type' – Edward

1

Vous devriez jeter un oeil ici: Arrays Tutorial in C#. Quoi qu'il en soit, voici la syntaxe: type[,] name pour les tableaux multidimensionnels, type[][] name pour les tableaux dentelés (changer type pour le type des objets à stocker dans le tableau).

+2

Comment ajoutez-vous au tableau après qu'il a été déclaré? –

1

Ce serait quelque chose comme ceci:

List<List<string>> twoDimensional = new List<List<string>>(); 

Mais je pense qu'il est impossible d'utiliser une liste pour cela, mieux recourir à des réseaux ...

+0

C'est simplement une liste de listes. Pas 2 dimensions. – leppie

+0

-1 Cela équivaut à un tableau en dents de scie, pas à un tableau à deux dimensions. –

+0

Hmm vous avez raison ... nous devrions avoir plus d'informations sur le contexte du problème, pourquoi il en a besoin etc. –

0

Avec les tableaux que vous ne pouvez pas, ils ne sont jamais 'dynamique'. Avec les listes, vous ne pouvez pas non plus (sauf si vous le faites ressembler en fournissant un indexeur supplémentaire), sauf si vous recherchez simplement une liste de listes (qui n'est pas multidimensionnelle).

Ce serait (pour une liste de liste de chaînes):

List<List<string>> 
2

vous pouvez utiliser la liste par exemple Liste> et la liste dans C# est très rapide.

mais par tableau à deux vous avez besoin d quelque chose comme:

int[,] arr = new int[100,100]; 

et cela devrait être plus rapide que la liste.

Questions connexes