分组通用列表

时间:2014-04-12 16:30:47

标签: 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(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 存在多次,则其类别字段必须为改为“ Grouped ”。

我该如何写这个表达式?

4 个答案:

答案 0 :(得分:1)

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 :(得分: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();

答案 2 :(得分:0)

你可以试试这个

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

答案 3 :(得分:0)

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

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

这将返回包含3个项目的新集合:IEnumerable<IGrouping<TKey, TSource>>;这基本上是指包含具有一个或多个项目的集合的集合。

然后你可以遍历那个新的集合并检查每个项目是否包含多个子项目;如果是,则迭代子项并修改Category值。

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