我有一个数据表有两行,有几列,其中一列是ABC。我已经验证数据行确实存在并且所有值都设置正确但下面的两行产生不同的结果:
//r3 =1
var r3 = dt.Select().Where(o => o["ABC"] == cls).Count();
//r4 =2 (correct)
var r4 = dt.Select().Count(o => o["ABC"].Equals(cls));
我尝试了第二种选择只是一个侥幸,但肯定这些应该做同样的事情?
答案 0 :(得分:0)
在对象上使用String.Equals
而非Object.ReferenceEquals
(==
运算符):
int count = dt.AsEnumerable().Count(r => r.Field<string>("ABC") == cls);
这是一个演示此问题的示例,还显示字符串实习绕过它的时间。
TestTable的:
var dt = new DataTable();
dt.Columns.Add("ABC");
dt.Rows.Add("Test");
dt.Rows.Add("Test"); // note that C# is case sensitive, maybe this is another issue
dt.Rows.Add("test");
第一个字符串is interned,因为它是字符串文字,因此可以从池中已有的字符串重用它。第二个字符串是使用不使用string pool的字符串构造函数创建的。
string cls1 = "test"; // uses string pool
string cls2 = new string("test".ToCharArray()); // skips pool
int count = dt.AsEnumerable().Count(r => r.Field<string>("ABC") == cls2); // 1
count = dt.Select().Where(o => o["ABC"] == cls1).Count(); // 1
count = dt.Select().Where(o => o["ABC"] == cls2).Count(); // 0
因此,如果您使用==
来比较字符串,则两者都应该是字符串。