数据表:通过LINQ或LAMBDA进行动态分组依据 [英] DataTable: dynamic Group By expression by LINQ or LAMBDA

查看:191
本文介绍了数据表:通过LINQ或LAMBDA进行动态分组依据的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

i've a DataTable in which i want to Group By for an unspecified number of fields. This happens why user can choose fields on which he wants to group.

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

So, actually, i push the choise in a List. And on this choise i have to group my DataTable.

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

Imagine this piece of code (VB or C# is the same):

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

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

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

What can i do ? How can i express GroupBy expression in this context.

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

Clearly, LINQ or LAMBDA solution is the same.

预先感谢您的帮助.

_

解决方案

阿列克斯·安德烈耶夫(Aleks Andreev)的回应行之有效!非常感谢.

Aleks Andreev's response works! Thanks much.

推荐答案

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

You can use custom equality comparer in GroupBy call. Define your comparer:

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));

这篇关于数据表:通过LINQ或LAMBDA进行动态分组依据的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆