为什么我的Linq GroupBy查询没有返回正确的计数值
本文关键字:返回 Linq 我的 GroupBy 查询 为什么 | 更新日期: 2023-09-27 18:09:28
下面的代码将CSV文件读入DataTable。然后循环遍历DataTable中的所有列,并尝试使用Linq查询生成每个列中所有不同值的计数:
var g = allValues.AsEnumerable().GroupBy(i => i);
为什么"grp.Count()"的值从不大于1,即使我知道所有的列包含重复的值?
private void button13_Click(object sender, System.EventArgs e)
{
DataSet ds = GetDataFromCSVFile(-1);
DataTable table = ds.Tables[0];
int test = 0;
string[] columnToSearch = { "" };
IList<ColumnDetail> colDetails = new List<ColumnDetail>();
foreach (DataColumn col in table.Columns)
{
columnToSearch[0] = col.ToString();
DataTable allValues = GetAllValuesFromColumn(table, columnToSearch);
var g = allValues.AsEnumerable().GroupBy(i => i);
test = 0;
foreach (var grp in g)
{
if (grp.Count() > 1)
MessageBox.Show(" grp.Key.ItemArray[0].ToString() : " + grp.Key.ItemArray[0].ToString() + " Cnt: " + grp.Count());
test++;
}
MessageBox.Show("Count is: " + test);
}
}
DataRow
的Equals
和GetHashCode
方法不是基于每一行的值,而是基于对象的引用。具有相同列值的两行不相等。您将需要创建一个自定义IEqualityComparer
,以便根据每个列的值比较行。
在这种特殊情况下,已经以DataRowComparer
类的形式编写了合适的实现,因此您可以根据行值而不是对行的引用对组进行分组时仅使用DataRowComparer.Default
作为IEqualityComparer
。