Confronta insieme DataRow to List
Domanda
ho un List<string>
e ho un DataTable.
Una delle colonne in un DataRow è ID. L'elenco contiene le istanze di questo ID.
Il DataTable viene popolato su un timer.
Voglio tornare voci dalla lista che non sono nella DataTable in un altro elenco.
Soluzione
Si vuole fare qualcosa di simile
var tableIds = table.Rows.Cast<DataRow>().Select(row => row["ID"].ToString());
var listIds = new List<string> {"1", "2", "3"};
return listIds.Except(tableIds).ToList();
È possibile lanciare le righe nella tabella di dati per essere una raccolta IEnumerable e quindi selezionare il valore della colonna "ID" da ciascuno di essi. È quindi possibile utilizzare il metodo di estensione Enumerable.Except per ottenere tutti i valori dalla lista che non sono nella collezione che hai appena fatto.
Se avete bisogno di ottenere i valori che sono nella tabella ma non nella lista, basta listIds e IDTabelle inverso.
Altri suggerimenti
Se la tabella era qualcosa di simile:
DataTable dt = new DataTable();
dt.Columns.Add("ID");
DataRow dr = dt.NewRow();
dt.PrimaryKey = new DataColumn[] {dt.Columns[0]};
dr["ID"] = "1";
dt.Rows.Add(dr);
dr = dt.NewRow();
dr["ID"] = "2";
dt.Rows.Add(dr);
dr = dt.NewRow();
dr["ID"] = "3";
dt.Rows.Add(dr);
e l'elenco è stato qualcosa di simile:
List<string> ls = new List<string>{"1","2","4"};
noi potremmo ottenere gli elementi trovati nella lista e non nel DataTable in questo modo:
var v = from r in ls
where !dt.Rows.Contains(r)
select r;
v.ToList();
Con ragionevole efficienza tramite HashSet<T>
(e notando che il modo più veloce per ottenere dati da un DataRow
è tramite l'indicizzatore DataColumn
):
HashSet<int> ids = new HashSet<int>();
DataColumn col = table.Columns["ID"];
foreach (DataRow row in table.Rows)
{
ids.Add((int)row[col]);
}
var missing = list.Where(item => !ids.Contains(item.ID)).ToList();