C#里使用linq做多个值的GroupBy操作,被操作对象类型为List<Dictionary<string, string>> datas
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C#里使用linq做多个值的GroupBy操作,被操作对象类型为List<Dictionary<string, string>> datas相关的知识,希望对你有一定的参考价值。
单个分组无错, var groupDatas = datas.GroupBy(d =>d["strGroupBy"]).OrderBy(g => g.Key);,
多个语法总是错误,例如: var groupDatas = datas.GroupBy(d =>newd["t09LibraryName"],d["strGroupBy"]).OrderBy(g => g.Key);
求正确语法,急求。
不过OrderBy语句不一定能够正确排序
因为这种匿名对象是无法得知如何比较大小的追问
这样得到的结果不知道是什么,仅仅只能编译过
追答你可以尝试把两个分组关键字字符串连接起来
var groupDatas = datas.GroupBy(d =>d["t09LibraryName"]+d["strGroupBy"] ).OrderBy(g => g.Key);
这样既能分组又能排序
当然这两个最好都是定长的或者用PadLeft之类的填充一下再+
更好也更麻烦的办法是
实现一个类 里面就2个字符串成员 实现IEquals和IComparable
再linq里new这个类 写入两个分组关键字,就能完美分组和排序
C# 2.0 - 有没有办法用产生的迭代器块做一个`GroupBy`?
【中文标题】C# 2.0 - 有没有办法用产生的迭代器块做一个`GroupBy`?【英文标题】:C# 2.0 - Is there any way to do a `GroupBy` with a yielded iterator block? 【发布时间】:2009-11-18 15:12:11 【问题描述】:我正在使用 C# 2.0 应用程序,因此 linq/lambda 答案在这里将无济于事。
基本上我面临的情况是我需要yield return
一个对象,但只有如果一个对象的属性是唯一的(分组依据)。例如,..say 我有一个用户集合,我想要一个基于名称的分组集合(我可能有 20 个 Dave,但我只想在我的集合中看到一个)。
现在我可以想到许多这可能有用的情况,但我认为在 C# 2.0 中如果没有我明确地跟踪我使用另一个内部列表产生的内容是不可能的。要做到这一点,我需要访问先前产生的集合以检查它们是否存在。
这是我想多了还是有意义?也许通过IEnumerable<T>
接口访问产量是有意义的,所以你可以做这样的事情-
IEnumerable<User> UsersByNameGroup(User userToGroupBy)
foreach(User u in Users)
if(!yield.Find(delegate(User u)return u.Name == userToGroupBy.Name;)) yield return u;
【问题讨论】:
如果你对用户列表进行排序,你只需要记住最后产生的值。但是请注意,排序可能是一项代价高昂的操作 (O(n log n))。 你在 Heinzi 的两边都提出了一个很好的观点,...不过我只是假设这个有用。 【参考方案1】:不,您必须在内部跟踪生成的元素。但请注意,基于哈希的查找数据结构(字典等)足以检测重复。
(附带说明:在 .NET 3.5 中,有内置的 GroupBy
-Methods)
【讨论】:
是的,GroupBy 扩展方法是提出这个问题的原因,但我在这个项目上坚持使用 2.0,..这不是我的决定。我也不能使用 HashSet,因为那是 3.5 主义,除非我参考 System.Core。以上是关于C#里使用linq做多个值的GroupBy操作,被操作对象类型为List<Dictionary<string, string>> datas的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Asp.net MVC C# 中使用 Linq 从多个表中选择具有最大计数值的记录