Linq要转向对象

时间:2014-11-16 18:43:14

标签: c# linq

为什么这段代码很好:

var rowsfilterdbyvaluemembercolumn =
    this.PrimaryDataSource.AsEnumerable().Where(r => r.Field<object>(this.ValueMemberColumn) == value);

这段代码不好:

var rowsfilterdbyvaluemembercolumn =
    this.PrimaryDataSource.AsEnumerable().Where(r => r.Field<int>(this.ValueMemberColumn) == Convert.ToInt32(value));

任何人都能解释一下吗?

2 个答案:

答案 0 :(得分:3)

因为第一个,r.Field<object>将值视为对象,因此在value上进行参考比较。因为这两个不是同一个对象,所以它们比较为不相等。

第二个将this.ValueMemberColumn转换为整数,并对您通过调用ToInt32创建的整数进行值比较。

有关详细信息,请参阅C#编程指南中的Equality Comparisons

答案 1 :(得分:0)

当您将两个整数作为对象进行比较时,会发生以下情况:编译器生成代码以将两个整数打包,以便它们现在是引用类型。所以它们现在被视为对象,编译器正在寻找这种类型的==运算符重载。对象类型没有,因此它回退到引用比较(它不会调用Equals)。即使总数相等,它们也总是被列为两个实例。所以他们现在不是平等的参考,他们不被视为平等。