按分组属性值对列表进行操作

本文关键字:列表 操作 属性 | 更新日期: 2023-09-27 18:13:36

我有一个具有以下结构的类:

class Test 
{    
    int Value { get; set; }
    List<string> Categories { get; set }
}

我想对按标签分组的集合进行操作,例如:

List<Test> myData = new List<Test>{ add n items };
myData.GroupBy(x => x.Categories ).Count(); // I know this wont work

我想要实现的是能够对匹配谓词的集合进行操作,然后返回该集合的值。理想情况下,我想有各种各样的容器类:

class Metrics 
{    
    int Max { get; set; }
    int Min { get; set; }
    double Avg { get; set; }
    double Mode { get; set; }
}

然后像这样使用(半伪代码)

Dictionary<string, Metrics> result = new Dictionary<string, Metrics>();
// find all unique categories across all my items in the list and then
foreach(string category in myData.Categories)
{    
   if(Tag not exists in result)
   {
       results.Add(category, new Metrics
       {
            Max = myData.GroupBy(x => x.Categories == category).Max,
            Avg = myData.GroupBy(x => x.Categories == category).Average()
       }); 
   }
}

按分组属性值对列表进行操作

使用SelectMany对一个扁平的匿名对象集合:

myData.SelectMany(item => item.Categories.Select(category => new { Category = category, Item = item}))
      .GroupBy(x => x.Category)
      .Where(/* The predicates you want to do */

由于您后来的查询似乎是对每个标签的数量的聚合,您还可以在GroupBy之后添加另一个Select,以使以后的聚合更简单:

.Select(grouping => new 
{ 
    Tag = grouping.Key,
    Amount = grouping.Count(),
    Items = grouping.Select(item => item.Item)
})