【问题标题】:DataTable: dynamic Group By expression by LINQ or LAMBDADataTable:LINQ 或 LAMBDA 的动态 Group By 表达式
【发布时间】:2019-04-03 09:02:37
【问题描述】:

我有一个数据表,我想在其中对未指定数量的字段进行分组。这就是为什么用户可以选择他想要分组的字段的原因。

所以,实际上,我将选择推送到列表中。在这个选择上,我必须对我的 DataTable 进行分组。

想象一下这段代码(VB或C#都一样):

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

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

我能做什么?在这种情况下如何表达 GroupBy 表达式。

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

提前感谢您的帮助。

_

解决方案

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

【问题讨论】:

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


    【解决方案1】:

    您可以在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));
    

    【讨论】:

    • 感谢您的回复安德烈夫。就一个问题。我对强制使用特定值的 GetHashCode 并不满意。使用它的正确方法是什么。必须如何使用。
    • @kinghomer 我用它来简化示例。如果你想实现GetHashCode,你可以使用return obj == null ? 0 : groupFields.Select(f =&gt; obj[f].GetHashCode()).Aggregate(397, (c, n) =&gt; c ^ n);之类的东西,其中397是一个素数来减少哈希冲突
    猜你喜欢
    • 2013-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-14
    相关资源
    最近更新 更多