3

いくつかのレコードをロードしたデータテーブルがあり、別のファイルからクエリを取得していて、このクエリで取得した ID がデータテーブルに存在するかどうかを確認したいと考えています。

foreach (var item in records)
{
    bool hasit = dt.AsEnumerable().Any(p => p.Field<string>(0) == item.ID);
    if (!hasit)
    {
        //Logic
    }
}

私はその .Any() 関数を使用しており、レコード コレクションの ID と一致するデータテーブルの最初のフィールドに ID がある場合、true を返すことを期待しています。常に false を返しますが、何か不足していますか? これを行うより良い方法はありますか?

4

3 に答える 3

2

私はその.Any()関数を使用しており、レコード コレクションの ID と一致するデータテーブルの最初のフィールドに ID がある場合、true を返すことを期待しています。それは継続的に返されますfalse

使用==すると、オブジェクト参照が比較されます。代わりに、値を比較Equalsするだけの使用をお勧めします。したがって、ステートメントを次のように変更します

dt.AsEnumerable().Any(p => p.Field<string>(0).Equals(item.ID))

これはあなたが期待していることを達成します。

于 2020-08-02T10:43:43.973 に答える
1

メソッド .Any(p => p.Field(0) == item.ID)

いずれかの要素が見つかった場合は true を返します。投稿されたコードは、次に行うことは尋ねることであると指定しています

if (!hasit)
{
    //Logic
}

これは、if(NOT any has it)... という意味で、正しくない動作を引き起こしています。次のように変更します。

if (hasit)
{
    //Logic
}

そして、あなたは望ましい結果を得るでしょう。

編集:観察のためのCuong Leへの称賛。

于 2013-08-27T16:13:06.000 に答える
0

エラーを見つけることができるかどうかを確認するために、それを分割してみます。

foreach (var item in records)
{
    var enumer = dt.AsEnumerable(); // <-- Check this to make sure it has elements
    var filtered = enumer.Any(p => p.Field<string>(0) == item.ID); // <- Check to make sure it has elements

}
于 2013-08-27T16:26:19.140 に答える