2014-05-19 18 views
19

Possiedo DataTable.Come ottenere l'elenco dei valori di una colonna da DataTable?

DataTable dt = new DataTable(); 

dt.Columns.Add(new DataColumn("id", Type.GetType("System.Int32"))); 
dt.Columns.Add(new DataColumn("name", Type.GetType("System.String"))); 
// more columns here 

Ho bisogno di un elenco di valori "id".

Posso farlo senza ciclo sopra tutte le righe del mio DataTable e senza Linq?

Edit:

Dopo piccola discussione con Sergei ho deciso di utilizzare ciclo comunque.

risposta

41

È possibile utilizzare LINQ to DataTable:

var ids = dt.AsEnumerable().Select(r => r.Field<int>("id")).ToList(); 

UPDATE: Senza Linq

List<int> ids = new List<int>(dt.Rows.Count); 
foreach(DataRow row in dt.Rows) 
    ids.Add((int)row["id"]); 

Nota per l'efficienza è meglio usare row[index] invece di row[columnName]. Prima si ottiene colonna per indice dall'array delle colonne. Latter ottiene l'indice di colonna dal dizionario interno che mappa i nomi in indici, e solo dopo diventa colonna per indice.

Un'altra cosa da notare è l'inizializzazione della capacità dell'elenco con il conteggio delle righe. Se non lo farai, la matrice interna della lista verrà ricreata e copiata molte volte (dipende dal conteggio delle righe).

E l'ultima cosa da dire - il modo più efficiente con una tabella enorme (se possibile) è filtrare i dati sul lato server.

+1

@TimSchmelter metodi di estensione con C# 2? :) –

+0

Il primo è con Linq, il secondo con il ciclo. Questo è quello che voglio evitare. – Kamil

+0

@Kamil Scommetto che non c'erano originariamente restrizioni di loop. Puoi spiegare cosa c'è di sbagliato nei loop? –

Problemi correlati