Linq Count 返回不同的结果
Linq Count is returning different results
我有一个数据表,它有两行和几列,其中一列是 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));
我尝试了第二种选择只是侥幸,但肯定这些应该做同样的事情?
使用 String.Equals
而不是 Object.ReferenceEquals
(对象上的 ==
运算符):
int count = dt.AsEnumerable().Count(r => r.Field<string>("ABC") == cls);
这是一个演示此问题的示例,还显示了字符串实习何时绕过它。
测试表:
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 since it is a string literal, so it is reused from the already available string in the pool. The second string is created using the string constructor which doesn't use the 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
因此,如果您使用 ==
比较字符串,则两者都应该是字符串。
我有一个数据表,它有两行和几列,其中一列是 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));
我尝试了第二种选择只是侥幸,但肯定这些应该做同样的事情?
使用 String.Equals
而不是 Object.ReferenceEquals
(对象上的 ==
运算符):
int count = dt.AsEnumerable().Count(r => r.Field<string>("ABC") == cls);
这是一个演示此问题的示例,还显示了字符串实习何时绕过它。
测试表:
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 since it is a string literal, so it is reused from the already available string in the pool. The second string is created using the string constructor which doesn't use the 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
因此,如果您使用 ==
比较字符串,则两者都应该是字符串。