【问题标题】:Linq Group by Values in a listLinq 按列表中的值分组
【发布时间】:2015-03-12 16:50:59
【问题描述】:

所以目前我有这个 TrackingInfo 类,它包含一个 ID 和一个 EmailActionID 列表,它是一个 int。 我有一个此类的列表,其数据如下所示:

ID,   |   EmailActions
_______________
 A    |   1, 3, 5
 B    |   3, 5, 6
 C    |   2, 4, 6

我正在尝试编写一个 Linq 语句,以将其转换为按列表中每个单独值分组的 ID 列表。

所以结果集看起来像:

ID   |   Values
_______________
 1    |   A
 2    |   C
 3    |   A, B
 4    |   C,
 5    |   A, B
 6    |   B, C

我不知道如何写这个组,谁能给我一些见解。

DistinctValues = new List<int> {1,2,3,4,5,6};
TrackingInfo.Groupby(t => DistinctValues.foreach(d => 
                                           t.EmailActions.Contains(d))).Tolist()

这当然没有关于如何使用 Linq 执行此操作的任何建议

【问题讨论】:

    标签: c# linq


    【解决方案1】:

    很容易获得EmailActions的不同列表

    var distinctEmailActions = items.SelectMany(i => i.EmailActions).Distinct();
    

    然后旋转这个有点复杂,但这里是:

    var result = distinctEmailActions.Select(e => new { 
                  ID=e, 
                  Values = items.Where(i => i.EmailActions.Contains(e)).Select(i => i.ID) 
    });
    

    现场示例:http://rextester.com/CQFDY66608

    【讨论】:

    • +1,我喜欢你的想法。这与我在查看任何答案之前的想法几乎相同。与其他一些答案不同,不需要额外的 GroupBy 子句。
    • 另外,您还从示例中破译了正确的不同
    【解决方案2】:

    您要查找的是SelectMany,但在这里使用查询语法更容易:

    var result = from item in source
                 from action in item.EmailActions
                 group item.ID by action into g
                 select new { ID = g.Key, Values = g.ToList() }
    

    【讨论】:

      【解决方案3】:

      您可以先使用Enumerable.Range 生成一个范围,然后匹配EmailActions,如下所示:

      var res = Enumerable.Range(1, 6)
          .SelectMany(v => TrackingInfo.Where(info => info.EmailActions.Contains(v)).Select(info => new { Id, Value = v }))
          .GroupBy(p => p.Value)
          .Select(g => new {
              Id = g.Key
          ,   Values = g.Select(p => p.Id).ToList()
          });
      

      【讨论】:

        【解决方案4】:

        您可以像这样使用SelectManyGroupBy 来实现这一点:-

        var result = tracking.SelectMany(x => x.EmailActionIDs, 
                                            (trackObj, EmailIds) => new { trackObj, EmailIds })
                             .GroupBy(x => x.EmailIds)
                             .Select(x => new
                               {
                                    ID = x.Key,
                                    Values = String.Join(",", x.Select(z => z.trackObj.ID))
                               }).OrderBy(x => x.ID);
        

        Working Fiddle.

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-08-07
          • 2023-03-21
          • 2013-11-27
          相关资源
          最近更新 更多