一覧表示するのDataRowコレクションの比較
質問
私はList<string>
を持っていると私は、DataTableのを持っています。
のDataRowの列の一つが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();
所属していません StackOverflow