如何使用Linq对集合中的每个项进行分组?

3

我正在尝试查找用于博客文章的最流行的标签

例如:

public class BlogPost
{
    public int Id { get; set; }
    public IEnumerable<string> Tags { get; set; }
}

所以我尝试了:

var tags = (from p in BlogPosts()
        group bp by bp.Tags into g
        select new {Tag = g.Key, Count = g.Count()})
    .OrderByDescending(o => o.Count)
    .Take(number);

但是这段代码不会编译。错误信息如下:无法将类型为'System.Linq.IQueryable<{Tag: System.IEnumerable<string>, Count: int}>'的隐式转换为类型为'System.Collections.Generic.Dictionary<string, int>'。

你看,它是一个字符串列表吗?我希望能够查看每篇博客文章中的每个标签,并计算最受欢迎的标签。


2
你所遇到的错误来自于你所发布的代码之外。你能否展示一下报错的代码呢? - svick
3个回答

3

我认为你不能对 IEnumerable<string> 进行分组,尝试使用以下代码:

var tags = (from t in BlogPosts.SelectMany(p => p.Tags)
        group t by t into g
        select new {Tag = g.Key, Count = g.Count()})
    .OrderByDescending(o => o.Count)
    .Take(number);

2
这里的关键是SelectMany。
  var tags = posts
     .SelectMany (p => p.Tags)
     .GroupBy (t => t).Select(t => new {Tag = t.First (), Count=t.Count ()})
     .OrderBy(tc => tc.Count)
     .Select(tc => tc.Tag)
     .Take (15);

0

你想要按照单个标签名称进行分组,而不是整个标签列表,这是你目前正在做的。尝试这样做:

var tags =
    (from p in posts
    from tag in p.Tags
    group tag by tag into g
    select new {Tag = g.Key, Count = g.Count()})
.OrderByDescending(o => o.Count)
.Take(number);

虽然这应该做到你所要求的,但它不会修复你遇到的编译错误。那个问题在别处。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接