c# - linq按自定义类分组

标签 c# linq

我在 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/

相关文章:

c# - 创建多级 MemberExpression

c# - 使用 Linq 合并列表列表

c# - Linq 确保没有两个对象具有相同的属性值

c# - 在方法签名中使用委托(delegate)和使用 Func<T>/Action<T> 有什么区别?

c# - 如何有效地异步登录?

linq - 复杂对象上的 MvcContrib 网格排序

linq - LINQ 查询返回的 Int 列表

c# - 表达评价设计题

c# - 如何禁用从excel复制图片

c# - 如何判断 EnvDTE.Project 对象是否代表 C/C++ 项目?