Vergleichen Sie die Datarow -Sammlung mit der Liste
Frage
Ich habe ein List<string>
Und ich habe ein DataTable.
Eine der Spalten in einem Datarow ist ID. Die Liste enthält Instanzen dieser ID.
Das DataTable wird auf einem Timer besiedelt.
Ich möchte Elemente aus der Liste zurückgeben, die nicht in einer anderen Liste in einer anderen Liste enthalten sind.
Lösung
Sie werden so etwas tun wollen
var tableIds = table.Rows.Cast<DataRow>().Select(row => row["ID"].ToString());
var listIds = new List<string> {"1", "2", "3"};
return listIds.Except(tableIds).ToList();
Sie können die Zeilen in der Datentabelle als eine iEnumerable Sammlung aufnehmen und dann den Spaltenwert "ID" aus jedem von ihnen auswählen. Sie können dann die aufzählbare Erweiterungsmethode verwenden, um alle Werte aus der Liste zu erhalten, die nicht in der gerade erstellten Sammlung enthalten sind.
Wenn Sie die Werte in der Tabelle erhalten müssen, aber nicht in der Liste, einfach umgekehrte ListIds und TableIds.
Andere Tipps
Wenn Ihr Tisch so etwas war:
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);
Und die Liste war so etwas:
List<string> ls = new List<string>{"1","2","4"};
Wir konnten die Elemente in der Liste und nicht auf diese Weise in der DataTable erhalten:
var v = from r in ls
where !dt.Rows.Contains(r)
select r;
v.ToList();
Mit angemessener Effizienz über HashSet<T>
(und feststellen, dass der schnellste Weg, Daten aus a zu holen DataRow
ist über die DataColumn
Indexer):
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();