1

我想列出所有已发布帖子的所有类别。但我想只显示一次类别。该类Post有一个道具Posts和道具的构造函数Categories。它是一个字符串数组而不是 List,我想保持这种状态。

public class Post
{
    public static List<Post> Posts = LoadPosts();
}

public Post()
{
    ID = Guid.NewGuid().ToString();
    Categories = new string[0]; //array, no List<string>
}

这是我的剃刀标记

<ul class="categories">
    @{var cl = Post.Posts.Where(p => p.IsPublished).Select(c => new List<string>(c.Categories));}
    @foreach (var cat in cl.Distinct())
    {
        <li>@cat</li>
    }
</ul>

这给了我作为输出

System.Collections.Generic.List`1[System.String]

我在我的 Linq 中做错了什么,但我没有足够的经验(或清醒)来看到我的错误。

4

1 回答 1

3

你需要的是SelectMany方法:

Post.Posts
   .Where(p => p.IsPublished)  // IEnumerable<Post>
   .SelectMany(c => c.Categories) // IEnumerable<string>
   .Distinct()

看起来很奇怪,但与 SQL 真正对应的select不是IEnumerable.Select方法,而是IEnumerable.SelectMany,因为它可以“扁平化”选择的结果,同时Select为每个元素创建一个单独的集合,从而导致:

Post.Posts
  .Where(p => p.IsPublished)  // IEnumerable<Post>
  .Select(c => c.Categories) // IEnumerable<IEnumerable<string>>
  .Distinct() // does nothing, since all inner IEnumerable<string> 
              // objects are different
于 2013-08-12T09:40:52.060 回答