C# 为什么我的Linq GroupBy查询没有返回正确的计数值?

C# 为什么我的Linq GroupBy查询没有返回正确的计数值?,c#,linq,csv,datatable,C#,Linq,Csv,Datatable,以下代码将CSV文件读入数据表。然后,它循环遍历DataTable中的所有列,并尝试使用Linq查询生成每列中所有不同值的计数: var g = allValues.AsEnumerable().GroupBy(i => i); 为什么即使我知道所有列都包含重复的值,grp.Count值也永远不会大于1 private void button13_Click(object sender, System.EventArgs e) { DataSet

以下代码将CSV文件读入数据表。然后,它循环遍历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,根据行的值而不是对行的引用进行分组。

谢谢。这解决了我的问题。我修改了行:var g=allValues.AsEnumerable.GroupByi=>I;to var g=allValues.AsEnumerable.GroupByi=>i,DataRowComparer.Default;