由DataTable按多列运行时分组

时间:2014-09-06 11:34:38

标签: c# asp.net .net linq datatable

列名称将在此列表中

列出lstPrimary; - 它将具有列名

我将在DataTable上使用GroupBy clasue,使用列表中的列" lstPrimary"

由于

1 个答案:

答案 0 :(得分:0)

只是执行GroupBy,因为数据行是对象的类型,所以不会按照您的预期进行分组。相反,您需要实现IEqualityComparer并将其传递给GroupBy。

此代码应作为参考,因为您可能会想要进行一些更改或了解这些限制。对于我没有针对Byte []类型的数据列测试它,我只测试了int,string,DateTime,decimal,我猜它会失败,除非Byte []是相同的数组。如果您需要,那么您将需要更改IEqualityComparer,我建议您查看MS如何为DataRowComparer http://referencesource.microsoft.com/#System.Data.DataSetExtensions/System/Data/DataRowComparer.cs

您希望改变的第二件事是哈希码代码。这只是一个简单的哈希码检查,只检查数组长度是否相同。如果您想要更好的东西,可以查看https://stackoverflow.com/a/3404820/1798889

public class DataRowValueComparer : IEqualityComparer<object[]>
{

    public bool Equals(object[] x, object[] y)
    {
        // didn't test but this probably doesn't work if one of the datacolumns is a Byte[]
        return x.SequenceEqual(y);
    }

    public int GetHashCode(object[] obj)
    {
        // You will want better hashcode 
        //  can look at https://stackoverflow.com/a/3404820/1798889 for more info
        return obj.Length.GetHashCode();
    }
}

现在我们可以调用GroupBy并使用它来比较每个数据行值

// group by passing in the IEqualityComparer
var grouped = dt.AsEnumerable().GroupBy(dr => lstPrimary.Select(col =>  dr[col]).ToArray(), new DataRowValueComparer());

密钥将是一个对象[]