LINQ分组[重复]

Posted

技术标签:

【中文标题】LINQ分组[重复]【英文标题】:LINQ Grouping by [duplicate] 【发布时间】:2020-12-01 02:11:59 【问题描述】:

我有类似的类对象列表

 public class MyClass
    
        public int UserId  get; set; 
        public int ItemId  get; set; 
        public string ItemName  get; set; 
    

我有这个列表,我想按 UserId 对它们进行分组。我追求的结果是List<MyClass> 的集合,其中每个列表都由用户列出

我已经应用了 group by 但不确定应该如何选择

  var group = items.GroupBy(g => g.UserId).
                Select(s=> new MyClass  
                UserId = s.Key,
              
                ).ToList();

样本数据

  var items = new List<MyClass>
            
                new MyClassUserId = 100, ItemId = 245, ItemName = "ABC",
                new MyClassUserId = 100, ItemId = 125, ItemName = "ABCff",
                new MyClassUserId = 150, ItemId = 233, ItemName = "AweBC",
                new MyClassUserId = 100, ItemId = 233, ItemName = "ABweweC"
            ;

在这里,我希望有两组 List&lt;MyClass&gt; 一个用户 ID 为 100 的列表和另一个用户 ID 为 150 的列表,每个列表将有 2 个类对象

【问题讨论】:

输出应该如何?用户 ID,列表? 不,只是List&lt;MyClass&gt; 那么你可以通过UserId订购当前items,这样你所有具有相同UserId的记录都将在同一个组中 我已经用示例数据和预期结果更新了问题 你想要列表> ? 【参考方案1】:

您可以使用UserId 作为键创建字典:

var groups = items.GroupBy(c => c.UserId)
                  .ToDictionary(g => g.Key, g => g.ToList());

现在举例如下:

 Console.WriteLine(String.Join(Environment.NewLine, groups[100]));

将打印出来:

100 245 ABC
100 125 ABCff
100 233 ABweweC

【讨论】:

【参考方案2】:

我想你在这之后会给你List&lt;List&lt;MyClass&gt;&gt;

var group = items.GroupBy(g => g.UserId).Select(s => s.ToList());

【讨论】:

那是 IEnumerable>,对吧?缺少一个 ToList 我想你明白了 正是我所追求的

以上是关于LINQ分组[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何使用linq按多列分组[重复]

Linq在C#中按2列分组[重复]

在 LINQ 中按特定列分组 [重复]

实体框架 LINQ - 具有分组依据的子查询

Linq分组,linq方法分组

如何按游戏分组并选择每个游戏的流派列表[重复]