【问题标题】:Grouping in a generic list在通用列表中分组
【发布时间】:2014-04-12 16:30:47
【问题描述】:

我有一个通用列表:

  List<Test> lstReport = new List<Test>();
  lstReport.Add(new Test { ID = 1, Category = "Hot work", Approver = "Praveen" });
  lstReport.Add(new Test { ID = 1, Category = "Civil work", Approver = "Praveen" });
  lstReport.Add(new Test { ID = 1, Category = "Others", Approver = "Praveen" });
  lstReport.Add(new Test { ID = 4, Category = "Hot work", Approver = "Praveen" });
  lstReport.Add(new Test { ID = 5, Category = "Critical work", Approver = "Praveen" });

现在我想通过 ID 值从通用列表中获取唯一行。 例如,我需要对具有相同 ID 的行进行分组,如果 ID 的 存在不止一次,那么它的 Category 字段必须是改为“分组”。

这个表达式怎么写?

【问题讨论】:

  • 你有Approver 的分组列表或其他逻辑吗?还是所有人都一样?
  • 这个设计有点奇怪,因为分组时会丢失各个Category和Approver字段的信息

标签: c# asp.net list generics


【解决方案1】:

这行得通:

    var QueryResult = (from x in lstReport
                        group x by x.ID into res
                        select new Test
                        {
                            ID = res.Key,
                            Category = res.Count() > 1 ? "Grouped" : res.First().Category,
                            Approver = res.First().Approver
                        }).ToList();

【讨论】:

  • 其实没有,这个创建匿名类型的新列表不会改变原来的项目
  • 我没有测试类,这就是我删除它的原因。已编辑。
  • @PraveenVR 仍然缺少的是你想用 Approver 做什么。你可以添加 -- Approver = res.First().Approver --
  • 是的,我也希望结果中的审批人姓名
  • @PraveenVR 如果审批人不同怎么办?
【解决方案2】:
List<Test> lstReport = new List<Test>();

...

var groups = lstReport.GroupBy(i => i.ID).ToList();

foreach(var group in groups) {
    var items = group.ToList();
    if(items.Count > 1)
        items.ForEach(i => { i.Category = "Grouped"; });
}

【讨论】:

  • +1 是第一个真正符合要求的答案!
  • 逻辑是正确的,但你有几个语法错误,而且ForEachList&lt;T&gt; 上的一个方法,你不能在IGrouping 接口上使用它
  • 感谢您的关注。我认为现在应该是。凭记忆写代码。
【解决方案3】:

你可以试试这个

var q = from r in lstReport
group r by r.ID into g
select new Test{ID=g.Key, Category = g.Count()>1? "Grouped" : g.Min(Category)};

你也可以有 g.Max(...) 或 g.Min(...)

【讨论】:

    【解决方案4】:

    您可以使用 Linq 根据某些属性对对象进行分组:

    var list = lstReport.GroupBy(t => t.ID);
    

    这将返回一个包含 3 个项目的新集合:IEnumerable&lt;IGrouping&lt;TKey, TSource&gt;&gt;;这基本上意味着一个集合,其中包含一个或多个项目的集合。

    然后您可以遍历该新集合并检查每个项目是否包含多个子项目;如果是,则遍历子项并修改类别值。

    http://msdn.microsoft.com/en-us/library/system.linq.enumerable.groupby(v=vs.110).aspx

    【讨论】:

      猜你喜欢
      • 2022-08-13
      • 1970-01-01
      • 2016-03-23
      • 2014-04-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-20
      • 1970-01-01
      相关资源
      最近更新 更多