1

次の LINQ を使用して、オブジェクトの 2 つのリストを比較しています。

var upd = newObj.Where(wb => oldObj.Any(db => 
                           (db.AnswerId == wb.AnswerId) &&
                           (db.Number != wb.Number || !db.Text.Equals(wb.Text))))
                .ToList(); 

AnswerId が一致したら、object.Number または object.Text が異なるかどうかを確認します。

しかし、これは私に与えています:

Object reference not set to an instance of an object. 

問題は、古いオブジェクトに Text フィールドが null に設定された回答がある場合だと思います。

!db.Text.Equals(wb.Text) 

私が期待したように動作しません。

上記の比較を変更して、テキストが異なる場合、または古いテキストがnullの場合、および正しいという名前のフィールドの値が変更された場合にtrueを表示する方法はありますか?

参考までに、私が使用しているオブジェクトは次のとおりです。

public class Answer     {
    public int AnswerId { get; set; }
    public int Number { get; set; }
    public int QuestionId { get; set; }
    public Nullable<bool> Correct { get; set; }
    public Nullable<bool> Response { get; set; }
    public string Text { get; set; }

}
4

4 に答える 4

1

あなたはただ使うことができますdb.Text != wb.Text。文字列メソッドを呼び出していないため、参照はありませんnull

于 2013-08-28T07:50:49.913 に答える
0

原因は Text が null であると想定していました。これは、LINQ 式内のオブジェクトを比較するときによくある問題です。誰も指摘していないように、解決策は通常、さらに null と比較することです。ただし、あなたの場合、解決策はより簡単です: != を使用して比較するだけです (テキストは文字列であるため、!= は !db.Text.Equals と同じです):

var upd = newObj.Where(wb => oldObj.Any(db => (db.AnswerId == wb.AnswerId) && 
   (db.Number != wb.Number || db.Text != wb.Text))).ToList();
于 2013-08-28T08:04:19.060 に答える
0

次の方法で Equals を使用できます。

Equals(db.Text, wb.Text);
于 2013-08-28T07:53:20.310 に答える
0

null 合体演算子を使用して、空のデフォルト コレクションを生成することがあります。

var filteredThings = (collection ?? new Thing[0]).Where(p => Thing.Desirable);

パフォーマンスはそれほど高くありませんが、空の配列を事前に初期化すると、その場所があります。

于 2013-08-28T07:59:49.833 に答える