web-dev-qa-db-fra.com

Listes multidimensionnelles en C #

À l’heure actuelle, j’utilise une seule liste pour stocker une partie de mes données, et cela fonctionne parfaitement dans ce format: 

Item
----------------
Joe Bloggs
George Forman
Peter Pan

Maintenant, je voudrais ajouter une autre ligne à cette liste, pour que cela fonctionne comme ceci:

NAME                    EMAIL
------------------------------------------------------
Joe Bloggs              [email protected]
George Forman           [email protected]
Peter Pan               [email protected]

J'ai essayé d'utiliser ce code pour créer une liste dans une liste, et ce code est utilisé dans une autre méthode dans une boucle foreach:

// Where List is instantiated
List<List<string>> list2d = new List<List<string>>

...

// Where DataGrid instance is given the list
dg.DataSource = list2d;
dg.DataBind();

...


// In another method, where all people add their names and emails, then are added
// to the two-dimensional list
foreach (People p in ppl.results) {
    list.Add(results.name);
    list.Add(results.email);
    list2d.Add(list);
}

Quand je lance ceci, j'obtiens ce résultat:

Capacity Count 
----------------
16       16 
16       16 
16       16
...      ...

Où est-ce que je vais mal ici. Comment puis-je obtenir la sortie que je désire avec le code que j'utilise actuellement?

21
Mike B

Pourquoi n'utilisez-vous pas un List<People> au lieu d'un List<List<string>>?

44
Thomas Levesque

Recommande fortement quelque chose de plus semblable à ceci:

public class Person {
    public string Name {get; set;}
    public string Email {get; set;}
}

var people = new List<Person>();

Plus facile à lire, facile à coder.

36
Sailing Judo

D'où proviennent les résultats variables?

Ce bloc:

foreach (People p in ppl.results) {
    list.Add(results.name);
    list.Add(results.email);
    list2d.Add(list);
}

Devrait probablement lire plus comme:

foreach (People p in ppl.results) {
    var list = new List<string>();
    list.Add(p.name);
    list.Add(p.email);
    list2d.Add(list);
}
4
Winston Smith

Vous devriez utiliser List<Person> ou un HashSet<Person>.

1
Nakul Chaudhary

Si, pour une raison quelconque, vous ne souhaitez pas définir une classe Person et utiliser List<Person> comme conseillé, vous pouvez utiliser un tuple, tel que (C # 7):

var people = new List<(string Name, string Email)>
{
  ("Joe Bloggs", "[email protected]"),
  ("George Forman", "[email protected]"),
  ("Peter Pan", "[email protected]")
};

var georgeEmail = people[1].Email;

Les noms de membres Name et Email sont facultatifs. Vous pouvez les omettre et y accéder en utilisant Item1 et Item2 respectivement.

Il y a des tuples définis pour un maximum de 8 membres.

Pour les versions antérieures de C #, vous pouvez toujours utiliser un List<Tuple<string, string>> (ou de préférence ValueTuple en utilisant ce package NuGet ), mais vous ne bénéficierez pas des noms de membre personnalisés.

0
Shimmy

Il est vieux mais je pensais ajouter 2 centimes .... Je ne sais pas si cela fonctionnera mais essayez d'utiliser un KeyValuePair:

 List<KeyValuePair<?, ?>> LinkList = new List<KeyValuePair<?, ?>>();
 LinkList.Add(new KeyValuePair<?, ?>(Object, Object));

Vous allez vous retrouver avec quelque chose comme ça:

 LinkList[0] = <Object, Object>
 LinkList[1] = <Object, Object>
 LinkList[2] = <Object, Object>

etc...

0
Rickey

S'il vous plaît montrer plus de votre code.

Si ce dernier morceau de code déclare et initialise la variable list en dehors de la boucle, vous réutilisez le même objet de liste, ce qui ajoute tout dans une liste.

Indiquez également où .Capacity et .Count entrent en jeu, comment avez-vous obtenu ces valeurs?