1

我正在使用以下 LINQ 来比较两个对象列表。

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. 

我认为问题是当旧对象的答案设置为 null 时

!db.Text.Equals(wb.Text) 

无法按我预期的方式工作。

有什么方法可以改变上面的比较,所以如果文本不同或者旧的 Text 为 null 并且名为 Correct 的字段的值发生变化,它会显示为 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

您可以尝试通过以下方式使用 Equals:

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

我有时使用 null-coalescing 运算符来生成空的默认集合。

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

性能不高,但如果您预先初始化空数组,它就有它的位置。

于 2013-08-28T07:59:49.833 回答
0

假设原因是 Text 为空,您是对的。在比较 LINQ 表达式中的对象时,这是一个常见问题。正如没有人指出的那样,解决方案通常是额外与空值进行比较。但是,在您的情况下,解决方案更简单:只需使用 != 进行比较(文本是字符串,因此 != 与 !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 回答