2009-08-03 28 views
18

Obecnie używam jednej listy do przechowywania jedną część moich danych, a to doskonale działa w następującym formacie:wielowymiarowe list w C#

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

Teraz chciałbym dodać kolejną linię do tej listy , na to, aby pracować tak:

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

próbowałem przy użyciu tego kodu, aby utworzyć listę w obrębie listy, a kod ten jest wykorzystywany w inny sposób w pętli 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); 
} 

Kiedy uruchamiam to uzyskać ten wynik:

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

Gdzie jestem będzie niewłaściwy tutaj. Jak mogę uzyskać pożądane wyniki za pomocą kodu, którego teraz używam?

+1

Może nie rozumiem, ale nie wygląda to na listę list, ale raczej listę rekordów, z których każdy ma dwa pola. Jeśli tak, być może właśnie tak powinieneś to modelować. –

Odpowiedz

40

Dlaczego nie używasz List<People> zamiast List<List<string>>?

+3

Już miałem powiedzieć, że to nie zadziała, zmieniłem zmienną DataGrid i czuję się jak idiota. Dziękuję Ci! –

0

Proszę pokazać więcej swojego kodu.

Jeśli ten ostatni fragment kodu deklaruje i inicjalizuje zmienną list poza pętlą, w zasadzie ponownie używasz tego samego obiektu listy, dodając wszystko do jednej listy.

Pokaż także, gdzie są dostępne pliki .Capacity i .Count, w jaki sposób otrzymałeś te wartości?

+0

Następnie musisz pokazać nam swój kod. Jeśli nie możesz stworzyć głów ani kodu własnego kodu, nie możemy tego zrobić, dopóki go nie opublikujesz. –

4

Skąd pochodzą wyniki zmiennych?

Blok:

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

prawdopodobnie powinien czytać więcej takich jak:

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

Powinieneś użyć List<Person> lub HashSet<Person>.

31

Gorąco polecam coś bardziej jak to:

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

var people = new List<Person>(); 

łatwiejsze do odczytania, łatwe do kodu.

+1

Podoba mi się ta odpowiedź, dzięki czemu zajęcia są bardziej czyste i odpowiednie w moim przypadku :) – CodeIt

0

To stary, ale pomyślałem, że mogę dodać swoje trzy grosze ... Nie wiem, czy to będzie działać, ale spróbuj użyć KeyValuePair:

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

Będziesz skończyć z czymś takim:

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

i tak dalej ...

0

Jeśli z jakiegoś powodu nie chcesz, aby zdefiniować klasę Person i używać List<Person> zgodnie z zaleceniami, można użyć krotki, s uch jak (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; 

Name i Email nazwy Poseł na są opcjonalne, można je pominąć i dostęp do nich za pomocą Item1 i Item2 odpowiednio.

Istnieją zdefiniowane krotki dla maksymalnie 8 członków.

W starszych wersjach języka C# można nadal używać List<Tuple<string, string>> (lub najlepiej ValueTuple przy użyciu this NuGet package), ale nie będzie można korzystać z niestandardowych nazw członków.