gpt4 book ai didi

c# - linq按自定义类分组

转载 作者:行者123 更新时间:2023-11-30 12:53:49 24 4
gpt4 key购买 nike

我在 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 查询不再按预期工作——它似乎根本没有进行任何分组。我的直觉是,这是因为它必须在内部比较每个 DataTable 行的分组键,并且字典键不被认为是相等的,因为它们具有相同的键和值,所以每一行都有不同的分组键,因此不聚合。

如果我是对的,那么解决这个问题的正确方法是什么?我尝试将字典包装在一个类中,并覆盖 Equals() 方法,但它从未被调用过。

最佳答案

为什么不让 GetKey() 以字符串形式返回 key ?

var a = dt.AsEnumerable().GroupBy(e => new { name = e[GetKey(e)] });

您可以根据指定列中的值创建键,并将其组合成一个字符串以进行分组:

var keyDictionary = new Dictionary<string, IEnumerable<string>>();
keyDictionary.Add("Table1", new List<string> {"Group", "Position"});

var dt = new DataTable("Table1");
dt.Columns.AddRange(new [] { new DataColumn("Id", typeof(int)), new DataColumn("Group", typeof(string)), new DataColumn("Position", typeof(string)), new DataColumn("Name", typeof(string))});
var rowItemArrays = new [] { new object[] { 1, "Alpha", "Left", "Bob" }, new object[] { 2, "Alpha", "Right", "Mary"}, new object[] { 3, "Beta", "Right", "Bill"}, new object[] { 4, "Alpha", "Right", "Larry"}};
rowItemArrays.ToList().ForEach(i => dt.Rows.Add(i));

Func<DataRow, string> GetKeys = (dataRow) => string.Join("", keyDictionary[dataRow.Table.TableName].Select(key => dataRow[key].ToString()).ToArray());

var a = dt.AsEnumerable().GroupBy(GetKeys);

您必须注意空值等......

关于c# - linq按自定义类分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1575402/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com