web-dev-qa-db-de.com

Mehrdimensionale Listen in C #

Im Moment verwende ich eine Liste, um einen Teil meiner Daten zu speichern, und es funktioniert perfekt in diesem Format: 

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

Nun möchte ich dieser Liste eine weitere Zeile hinzufügen, damit es so funktioniert:

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

Ich habe versucht, mit diesem Code eine Liste innerhalb einer Liste zu erstellen, und dieser Code wird in einer anderen Methode in einer Foreach-Schleife verwendet:

// 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);
}

Wenn ich das ausführen, erhalte ich dieses Ergebnis:

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

Wo gehe ich hier schief? Wie erhalte ich die gewünschte Ausgabe mit dem Code, den ich gerade verwende?

21
Mike B

Warum verwenden Sie nicht einen List<People> anstelle eines List<List<string>>?

44
Thomas Levesque

Ich empfehle etwas mehr davon:

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

var people = new List<Person>();

Einfacher zu lesen, einfach zu codieren.

36
Sailing Judo

Woher kommen die variablen Ergebnisse?

Dieser Block:

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

Sollte wahrscheinlich mehr lesen als:

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

Sie sollten List<Person> oder einen HashSet<Person> verwenden.

1
Nakul Chaudhary

Wenn Sie aus irgendeinem Grund keine Person-Klasse definieren und List<Person> wie empfohlen verwenden möchten, können Sie ein Tuple wie (C # 7) verwenden:

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

var georgeEmail = people[1].Email;

Die Mitgliedsnamen Name und Email sind optional. Sie können sie weglassen und über Item1 und Item2 darauf zugreifen.

Es gibt definierte Tupel für bis zu 8 Mitglieder.

Für frühere Versionen von C # können Sie weiterhin einen List<Tuple<string, string>> (oder vorzugsweise ValueTuple mit dieses NuGet-Paket ) verwenden, aber Sie profitieren nicht von benutzerdefinierten Mitgliedsnamen.

0
Shimmy

Es ist alt, aber ich dachte, ich würde meine zwei Cents hinzufügen ... Nicht sicher, ob es funktioniert, aber versuchen Sie es mit einem KeyValuePair:

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

Sie werden am Ende mit so etwas enden:

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

und so weiter...

0
Rickey

Bitte zeigen Sie mehr von Ihrem Code.

Wenn der letzte Code die Variable list außerhalb der Schleife deklariert und initialisiert, verwenden Sie im Grunde das gleiche Listenobjekt und fügen so alles in eine Liste ein.

Zeigen Sie auch, wo .Capacity und .Count ins Spiel kommen, wie haben Sie diese Werte erhalten?