【问题标题】:Group by on DataTable by multiple columns runtime按多列运行时在 DataTable 上分组
【发布时间】:2014-10-31 05:30:34
【问题描述】:

列名将在此列表中

List lstPrimary;--它将有列名

我将使用此列表“lstPrimary”中的列在 DataTable 上使用 GroupBy 子句

谢谢

【问题讨论】:

  • 当我回答你的问题时,你应该更新你的问题。第一个 asp.net 标签对这个问题没有任何意义。第二,您应该展示您尝试过的内容和一些代码,这样人们就不必猜测 lstPrimary 是什么。我没有否决这个问题,但如果你不更新它,你可能会得到更多。由于必须使用 IEqualityComparer,这不是一个坏问题,您只是没有提供足够的信息。

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


【解决方案1】:

只是进行 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());

键将是一个对象[]

【讨论】:

    猜你喜欢
    • 2012-05-10
    • 1970-01-01
    • 1970-01-01
    • 2018-10-21
    • 1970-01-01
    • 1970-01-01
    • 2019-11-02
    • 2020-06-01
    • 1970-01-01
    相关资源
    最近更新 更多