C# 在通用列表中分组

C# 在通用列表中分组,c#,asp.net,list,generics,C#,Asp.net,List,Generics,我有一个通用列表: 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(n

我有一个通用列表:

  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" });
List lstReport=newlist();
添加(新测试{ID=1,Category=“Hot work”,Approver=“Praveen”});
添加(新测试{ID=1,Category=“土建工程”,Approver=“Praveen”});
添加(新测试{ID=1,Category=“Others”,Approver=“Praveen”});
添加(新测试{ID=4,Category=“Hot work”,Approver=“Praveen”});
添加(新测试{ID=5,Category=“Critical work”,Approver=“Praveen”});
现在,我想通过ID值从通用列表中获取唯一的行。 例如,我需要对具有相同ID的行进行分组,如果ID的存在次数超过一次,则其类别字段必须更改为“分组

我怎样才能写出这个表达式呢?

你可以试试这个

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(…)

List lstReport=new List();
...
var groups=lstReport.GroupBy(i=>i.ID.ToList();
foreach(组中的var组){
var items=group.ToList();
如果(items.Count>1)
items.ForEach(i=>{i.Category=“Grouped”;});
}

此方法有效:

    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();

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

var list = lstReport.GroupBy(t => t.ID);
这将返回一个包含3项的新集合:
IEnumerable
;这基本上意味着一个集合包含一个集合和一个或多个项目

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


+1感谢您成为第一个真正做到所问内容的答案!逻辑是正确的,但您有几个语法错误,而且
ForEach
List
上的一种方法,您不能在
i分组
界面上使用它,请注意。我想应该是现在。从内存中编写代码。事实上不,这个创建匿名类型的新列表不会更改原始项我没有测试类,这就是我删除它的原因。已编辑。@PraveenVR关于仍然缺少的东西是您想对审批人做什么。您可以添加--Approver=res.First().Approver--是的,我希望在result@PraveenVR如果批准人不同怎么办?您是否有组中的
批准人列表或其他逻辑?或者对所有人都一样?顺便说一下,这种设计有点奇怪,因为分组时会丢失单个类别和审批人字段的信息
var list = lstReport.GroupBy(t => t.ID);