私はList<string>
とDataTableを持っています。
DataRowの列の1つはIDです。リストには、このIDのインスタンスが含まれています。
DataTableはタイマーに入力されます。
DataTableにないアイテムをリストから別のリストに戻したいのですが。
あなたはこのようなことをしたいと思うでしょう
var tableIds = table.Rows.Cast<DataRow>().Select(row => row["ID"].ToString());
var listIds = new List<string> {"1", "2", "3"};
return listIds.Except(tableIds).ToList();
データテーブルの行をIEnumerableコレクションにキャストしてから、各行から「ID」列の値を選択できます。次に、Enumerable.Except拡張メソッドを使用して、作成したコレクションにないすべての値をリストから取得できます。
テーブルにはあるがリストにはない値を取得する必要がある場合は、listIdsとtableIdsを逆にします。
あなたのテーブルがそのようなものだった場合:
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);
リストは次のようなものでした:
List<string> ls = new List<string>{"1","2","4"};
この方法では、データテーブルではなくリストで見つかったアイテムを取得できます。
var v = from r in ls
where !dt.Rows.Contains(r)
select r;
v.ToList();
を介して妥当な効率で(そして、からデータを取得するための最速の方法はインデクサーを介するHashSet<T>
ことであることに注意してください):DataRow
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();