6

私はList<string>とDataTableを持っています。

DataRowの列の1つはIDです。リストには、このIDのインスタンスが含まれています。

DataTableはタイマーに入力されます。

DataTableにないアイテムをリストから別のリストに戻したいのですが。

4

3 に答える 3

15

あなたはこのようなことをしたいと思うでしょう

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を逆にします。

于 2010-01-05T11:28:12.497 に答える
1

あなたのテーブルがそのようなものだった場合:

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();
于 2010-01-05T12:17:47.813 に答える
1

を介して妥当な効率で(そして、からデータを取得するための最速の方法はインデクサーを介するHashSet<T>ことであることに注意してください):DataRowDataColumn

        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();
于 2010-01-05T12:56:38.650 に答える