首页 / C# / c# – linq按自定义类分组
c# – linq按自定义类分组
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – linq按自定义类分组,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1667字,纯文字阅读大概需要3分钟。
内容图文
![c# – linq按自定义类分组](/upload/InfoBanner/zyjiaocheng/768/145d560df1c34301912dc4430d686413.jpg)
我在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()将键作为字符串返回?
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按自定义类分组全部内容,希望文章能够帮你解决c# – linq按自定义类分组所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。