web-dev-qa-db-fra.com

Tableau multidimensionnel ou liste en C #?

Est-il possible de créer une liste multidimensionnelle en C #? Je peux créer un tableau multidimensionnel comme ceci:

 string[,] results = new string[20, 2];

Mais j'aimerais pouvoir utiliser certaines des fonctionnalités d'une liste ou d'une liste de tableaux comme pouvoir ajouter et supprimer des éléments.

13
etoisarobot

Vous pouvez créer une liste de listes

   public class MultiDimList: List<List<string>> {  }

ou un dictionnaire de listes accessibles par clé

   public class MultiDimDictList: Dictionary<string, List<int>>  { }
   MultiDimDictList myDicList = new MultiDimDictList ();
   myDicList.Add("ages", new List<int>()); 
   myDicList.Add("Salaries", new List<int>()); 
   myDicList.Add("AccountIds", new List<int>()); 

Versions génériques, pour implémenter la suggestion dans le commentaire de @ user420667

  public class MultiDimList<T>: List<List<T>> {  }

et pour le dictionnaire,

   public class MultiDimDictList<K, T>: Dictionary<K, List<T>>  { }

  // to use it, in client code
   var myDicList = new MultiDimDictList<string, int> ();
   myDicList.Add("ages", new List<T>()); 
   myDicList["ages"].Add(23);
   myDicList["ages"].Add(32);
   myDicList["ages"].Add(18);

   myDicList.Add("salaries", new List<T>());
   myDicList["salaries"].Add(80000);
   myDicList["salaries"].Add(100000);

   myDicList.Add("accountIds", new List<T>()); 
   myDicList["accountIds"].Add(321123);
   myDicList["accountIds"].Add(342653);

ou, mieux encore, ...

   public class MultiDimDictList<K, T>: Dictionary<K, List<T>>  
   {
       public void Add(K key, T addObject)
       {
           if(!ContainsKey(key)) Add(key, new List<T>());
           if (!base[key].Contains(addObject)) base[key].Add(addObject);
       }           
   }


  // and to use it, in client code
    var myDicList = new MultiDimDictList<string, int> ();
    myDicList.Add("ages", 23);
    myDicList.Add("ages", 32);
    myDicList.Add("ages", 18);
    myDicList.Add("salaries", 80000);
    myDicList.Add("salaries", 110000);
    myDicList.Add("accountIds", 321123);
    myDicList.Add("accountIds", 342653);

EDIT: pour inclure une méthode Add () pour l'instance imbriquée:

public class NestedMultiDimDictList<K, K2, T>: 
           MultiDimDictList<K, MultiDimDictList<K2, T>>: 
{
       public void Add(K key, K2 key2, T addObject)
       {
           if(!ContainsKey(key)) Add(key, 
                  new MultiDimDictList<K2, T>());
           if (!base[key].Contains(key2)) 
               base[key].Add(key2, addObject);
       }    
}
35
Charles Bretana

vous faites juste une liste de listes comme ceci:

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

et puis c'est juste une question d'utiliser la fonctionnalité que vous voulez

results.Add(new List<string>()); //adds a new list to your list of lists
results[0].Add("this is a string"); //adds a string to the first list
results[0][0]; //gets the first string in your first list
7
Joseph

Pas exactement. Mais vous pouvez créer une liste de listes:

var ll = new List<List<int>>();
for(int i = 0; i < 10; ++i) {
    var l = new List<int>();
    ll.Add(l);
}
4
Mehrdad Afshari

En fonction de vos besoins exacts, vous pouvez faire mieux avec un tableau en dents de scie avec:

List<string>[] results = new { new List<string>(), new List<string>() };

Ou vous pouvez bien faire avec une liste de listes ou une autre construction similaire.

1
John Gietzen

Si vous souhaitez modifier cela, je choisirais l'une des options suivantes:

List<string[]> results;

-- ou --

List<List<string>> results;

selon vos besoins ...

1
csharptest.net