2013-08-12 6 views
1

Я хочу перечислить все категории всех опубликованных сообщений. Но я хотел бы показывать категории только один раз. Класс Post имеет опору Posts и конструктор для опоры Categories. Это массив строк вместо List, и я хотел бы сохранить его таким образом.Группа Linq по отдельным и итерационным данным

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, но я недостаточно опытен (или бодрствую), чтобы увидеть свою ошибку.

ответ

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 
+1

Спасибо, что сделал! Теперь я должен ждать 10 минут, чтобы принять ваш ответ. –

Смежные вопросы