2015-01-27 2 views
0

Я пытаюсь сгруппировать последовательность из Post s по каждому различный тег в базе данных.Как я могу группировать отдельный список?

public class Post 
{ 
    public string Title { get; set; } 
    public IEnumerable<string> Tags { get; set; } 

    public static IEnumerable<Post> SeedPosts() 
    { 
     yield return new Post { Title = "Foo", Tags = new[] { "Code" } }; 
     yield return new Post { Title = "Foo1", Tags = new[] { "Code", "Productivity" } }; 
     yield return new Post { Title = "Foo2", Tags = new[] { "Miscellaneous" } }; 
    } 
} 

Я хочу взять результат SeedPosts и произвести следующий вывод консольного приложения

Code 
Foo 
Foo1 
Productivity 
    Foo1 
Miscellaneous 
    Foo2 

Я полностью тупик, но я сделаю попытку показать вам то, что я пытался до сих пор ,

мне нужно Key быть типа string, но когда я делаю это

posts.GroupBy(post => post.Tags); 

ключ является тип IEnumerable<string>. Я понимаю, что я группирую IEnumerable<string>, поэтому ключ IEnuemrable<string>, но я вообще вообще застрял.

+0

Возможный дубликат [LINQ: как группировать, так что элемент может быть добавлен ко многим группам] (http://stackoverflow.com/q uestions/28109832/linq-how-to-group-by-so-element-can-be-add-to-many-groups) – ASh

+0

Взгляните на мой вопрос [тот же вопрос] (http://stackoverflow.com/ questions/28109832/linq-how-to-group-by-so-element-can-be-add-to-many-groups), я думаю, что вам нужно то же самое, что и я. –

+0

Я думаю, что лучшим подходом было бы создание копировать элементы с более чем одним тегом и тем самым создавать сплющенный список элементов, каждый из которых имеет только один тег. –

ответ

2

Попробуйте это:

+0

Этот трюк - спасибо. –

2

Свести список либо на новый список или же один

 var posts = new List<Post>(); 

     posts.Add(new Post { Title = "Foo", Tags = new[] { "Code" } } ); 
     posts.Add(new Post { Title = "Foo1", Tags = new[] { "Code", "Productivity" } }); 
     posts.Add(new Post { Title = "Foo2", Tags = new[] { "Miscellaneous" } }); 


     var flattendPosts = new List<Post>(); 

     foreach (var post in posts) 
     { 
      var tags = post.Tags.Select(tag => tag);     
      for (int i = 0; i < tags.Count(); i++) 
      { 
       flattendPosts.Add(new Post { Title = post.Title, Tag = post.Tags[i] }); 
      }    
     } 



     flattendPosts.GroupBy(post => post.Tags); 
1

Вы действительно не нужен Dictionary, если все вы хотите outpuuting это к Консоль:

var posts = Post.SeedPosts(); 

var tagGroups = posts 
       .SelectMany(p => p.Tags, (post, tag) => new{Tag = tag, post.Title}) 
       .GroupBy(pair => pair.Tag); 

foreach (var tagGroup in tagGroups) 
{ 
    Console.WriteLine(tagGroup.Key); 

    foreach (var pair in tagGroup) 
    { 
     Console.WriteLine(" " + pair.Title); 
    } 
} 

Console.ReadKey(); 
Смежные вопросы