2009-08-03 16 views
18

Al momento sto utilizzando una lista di memorizzare una parte dei miei dati, ed è perfettamente funzionante in questo formato:liste multidimensionali in C#

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

Ora, vorrei aggiungere un'altra linea a questa lista , per farlo funzionare in questo modo:

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

ho provato con questo codice per creare un elenco all'interno di un elenco, e questo codice viene utilizzato in un altro metodo in un ciclo 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); 
} 
.210

Quando eseguo questo, ottengo questo risultato:

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

dove sto andando male qui. Come posso ottenere l'output che desidero con il codice che sto usando in questo momento?

+1

Forse sto fraintendendo, ma questo non sembra un elenco di elenchi, ma piuttosto un elenco di record, ciascuno con due campi. Se è così, forse è così che dovresti modellare questo. –

risposta

40

Perché non si utilizza un List<People> invece di un List<List<string>>?

+3

Stavo per dire che non avrebbe funzionato per me, poi ho cambiato la mia variabile DataGrid e ora mi sento un idiota. Grazie! –

0

Si prega di mostrare più del vostro codice.

Se l'ultima parte di codice dichiara e inizializza la variabile list all'esterno del loop, si sta sostanzialmente riutilizzando lo stesso oggetto elenco, aggiungendo quindi tutto in un unico elenco.

Mostra anche dove sono entrati in gioco .Capacity e .Count, come hai ottenuto quei valori?

+0

Quindi devi mostrarci il tuo codice. Se non riesci a creare teste o code del tuo codice, non possiamo farlo a meno che tu non lo pubblichi. –

4

Da dove provengono i risultati della variabile?

Questo blocco:

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

dovrebbe probabilmente leggere più come:

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

È necessario utilizzare List<Person> o HashSet<Person>.

31

Raccomandiamo gli qualcosa di più simile a questo:

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

var people = new List<Person>(); 

più facile da leggere, facile da codice.

+1

Mi piace questa risposta, fare una lezione è più pulita e appropriata nel mio caso :) – CodeIt

0

E 'vecchio, ma ho pensato di aggiungere i miei due centesimi ... Non so se funzionerà, ma provare a utilizzare un KeyValuePair:

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

vi ritroverete con qualcosa di simile:

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

e così via ...

0

Se per qualche motivo non si vuole definire una classe Person e utilizzare List<Person> come consigliato, è possibile utilizzare una tupla, s uch come (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; 

I nomi dei membri Name e Email sono opzionali, è possibile omettere e accedervi utilizzando Item1 e Item2 rispettivamente.

Ci sono tuple definite per un massimo di 8 membri.

Per le versioni precedenti di C#, è comunque possibile utilizzare un List<Tuple<string, string>> (o, preferibilmente, ValueTuple usando this NuGet package), ma non sarà possibile beneficiare di nomi dei membri personalizzati.

Problemi correlati