数据表:通过LINQ或LAMBDA进行动态分组依据表达

时间:2019-04-03 09:02:38

标签: c# vb.net linq datatable group-by

我有一个DataTable,我要在其中分组一个未指定数量的字段。这是为什么用户可以选择要分组的字段的原因。

因此,实际上,我将选择放在列表中。在这种选择下,我必须将我的数据表分组。

想象一下这段代码(VB或C#相同):

public void groupFieldsFN(DataTable dt, List<string> groupFields){

    var grpQuery = dt.AsEnumerable().GroupBy(r => [***groupFields***]);
}

我该怎么办?在这种情况下,我该如何表达GroupBy表达式。

很明显,LINQ或LAMBDA解决方案是相同的。

预先感谢您的帮助。

_

解决方案

Aleks Andreev的回应奏效!非常感谢。

1 个答案:

答案 0 :(得分:2)

您可以在GroupBy调用中使用自定义相等比较器。定义比较器:

public class CustomEqualityComparer : IEqualityComparer<DataRow>
{
    private readonly List<string> groupFields;

    public CustomEqualityComparer(List<string> groupFields)
    {
        this.groupFields = groupFields;
    }

    public bool Equals(DataRow x, DataRow y)
    {
        var xCols = groupFields.Select(f => x[f]);
        var yCols = groupFields.Select(f => y[f]);
        var pairs = xCols.Zip(yCols, (v1, v2) => (v1, v2));
        return pairs.All(p => p.Item1.Equals(p.Item2));
    }

    public int GetHashCode(DataRow obj)
    {
        return 42; // force Equals call
    }
}

并使用它

var grpQuery = dt.AsEnumerable().GroupBy(r => r, new CustomEqualityComparer(groupFields));