[英]Group by on string Array in List of items c#
我有一个BlogPageModel
List
,在List
中我有类别的字符串数组。
Model class 如下所示:
public class BlogPageModel : BaseModel
{
public string Title { get; set; }
public string Slug { get; set; }
public string[] Category { get; set; }
}
我想列出所有博客类别的列表,即 output,即
Travel-20
Entertainment-5
注意:Travel-20 表示列表中有 20 个博客有旅游类别,娱乐 5 表示 5 个博客是娱乐类别,记住很少有博客同时具有这两个类别。
我尝试如下应用GroupBy
:
_client.GetRecords().Result.GroupBy(x => x.Category).Select(x => new { Key = x.Key })
但它不起作用并返回博客列表。
我也在下面尝试过:
我不确定我在查询中做错了什么。
在分组之前,您可以将博客及其类别列表扩展到仅包含该类别的新序列:
_client.GetRecords().Result.SelectMany(blog => blog.Category).GroupBy(x => x.Category).Select(x => x.Key + "-" + x.Count());
x 是一个 IGrouping,基本上就像一个 List 和一个 Key。 您可以在其上执行您在列表中执行的操作,例如 Count 或 First。 列表中的每个项目都有一个共同的 Key,它被选为 GroupBy 的一部分。 在这种情况下,键为“Travel”的 x 是 20 类长的列表
顺便说一句,(假设 GetRecords 返回一个任务)考虑您是否应该使用.Result
- 它会阻塞调用线程直到操作完成,这是一个很好的方式来消除基于任务的异步模式的所有优势并恢复为同步代码。 如果您改为await
GetRecords(应该称为 GetRecordsAsync),那么它将释放线程到 go 并在返回记录时执行其他操作
(await _client.GetRecords()).SelectMany(blog => blog.Category).GroupBy(x => x.Category).Select(x => x.Key + "-" + x.Count());
如果您想在 SelectMany 结束后保留博客 object,您可以使用:
(await _client.GetRecords()).SelectMany(b => blog.Category, (b, c) => new { Blog = blog, Cat = c })
您将获得一个具有 Nblogs * Ncategories 的枚举(25 项)
首先使用SelectMany
展平结果。 您应该再次使用GroupBy
按键对标签进行分组,最后像这样计算它们:
var result = _client.GetRecords().Result
.SelectMany(x => x.Category)
.GroupBy(x => x)
.Select(x => $"{x.Key}-{x.Count()}");
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.