我在DataTable上使用linq(在c#中),并且想知道如何按多个字段进行分组 . 我发现可以使用匿名类完成,例如
var a = dt.AsEnumerable().GroupBy(e => new { name = e["Name"] })
问题是,我的分组键是在运行时动态确定的 . 所以我改为尝试按字典分组:
var a = dt.AsEnumerable().GroupBy(e => GetKey(e))
其中 GetKey(e)
返回 Dictionary<string, object>
. 我们的想法是,字典值取代了匿名类键和值 . 我的问题是linq查询不再按预期工作 - 它没有't seem to do any grouping at all. my hunch is that it' s因为在内部它必须比较每个DataTable行的分组键,并且字典键不被认为是相同的只是因为它们具有相同的键和值,因此每行具有不同的分组键,因此不会聚合 .
如果我是对的,那么解决这个问题的正确方法是什么?我尝试在类中包装字典,并重写Equals()方法,但它从未被调用过 .
3 回答
为什么不让GetKey()将键作为字符串返回?
您可以从指定列中的值创建密钥,并将其组合为一个字符串以进行分组:
你必须注意空值等....
这是从帮助文件和我尚未实现的东西,但应该工作 . 问题是你需要一个类来进行比较,它在比较中同时使用ToString和GetHashCode(这就是为什么你的字典想法不起作用,它不是比较字典的元素,而是比较ToString和它的GetHashCode) . 让GetKey返回以下类,并使用上面的Dictionary填充类的keyBag:
这是你可以尝试我的朋友的最好的逻辑,我们有很多关于这方面的研究,所以我写的答案是我的教授给出的逻辑