À 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?
Pourquoi n'utilisez-vous pas un List<People>
au lieu d'un List<List<string>>
?
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.
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);
}
Vous devriez utiliser List<Person>
ou un HashSet<Person>
.
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.
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...
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?