按分组属性值对列表进行操作
本文关键字:列表 操作 属性 | 更新日期: 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)
})