2009-08-03 16 views
18

Im Moment habe ich eine Liste bin mit einem Teil meiner Daten zu speichern, und es funktioniert perfekt in diesem Format:Multidimensional Listen in C#

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

Nun würde Ich mag eine andere Linie zu dieser Liste hinzuzufügen , denn es ist wie so zu arbeiten:

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

ich habe versucht, diesen Code mit einer Liste innerhalb einer Liste zu erstellen, und dieser Code in einem anderen Verfahren in einer foreach-Schleife verwendet wird:

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

Als ich das laufen lasse, erhalte ich dieses Ergebnis:

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

Wo ich hier falsch bin gehen. Wie kann ich die gewünschte Ausgabe mit dem Code erhalten, den ich gerade verwende?

+1

Vielleicht bin ich Missverständnis, aber das sieht nicht wie eine Liste von Listen aus, sondern eher eine Liste von Datensätzen mit jeweils zwei Feldern. Wenn ja, sollten Sie das vielleicht so modellieren. –

Antwort

40

Warum Sie keine List<People> anstelle eines List<List<string>> verwenden?

+3

Ich wollte gerade sagen, dass es für mich nicht funktionieren würde, dann änderte ich meine DataGrid-Variable und jetzt fühle ich mich wie ein Idiot. Vielen Dank! –

0

Bitte zeigen Sie mehr von Ihrem Code.

Wenn das letzte Stück Code die list Variable 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?

+0

Dann müssen Sie uns Ihren Code zeigen. Wenn Sie nicht Ihren eigenen Code erstellen können, können wir dies auch nicht tun, es sei denn, Sie veröffentlichen ihn. –

4

Woher kommen die variablen Ergebnisse?

Dieser Block:

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

wahrscheinlich eher Soll heißen:

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

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

31

Sehr zu empfehlen diese etwas mehr wie:

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

var people = new List<Person>(); 

Einfachere, leicht zu Code zu lesen.

+1

Ich mag diese Antwort, wodurch eine Klasse in meinem Fall sauberer und angemessener ist :) – CodeIt

0

Es ist alt, aber dachte, dass ich meine zwei Cent hinzufügen würde ... nicht sicher, ob es funktionieren wird aber versuchen, eine KeyValuePair mit:

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

Sie werden mit etwas am Ende wie folgt:

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

und so weiter ...

0

Wenn aus irgendeinem Grund wollen Sie keine Person Klasse definieren und List<Person> verwenden, wie empfohlen, können Sie ein Tupel verwenden, s uch als (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; 

Die Name und Email Mitgliedernamen sind optional, können Sie sie weglassen und auf sie zugreifen Item1 und Item2 mit jeweils.

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

Für frühere Versionen von C# können Sie immer noch eine List<Tuple<string, string>> (oder vorzugsweise ValueTuple mit this NuGet package) verwenden, aber Sie werden nicht von benutzerdefinierten Mitgliedsnamen profitieren.