2010-06-07 3 views
1

Для метода у меня есть следующий параметр IEnumerable<string> tags и для запроса списка объектов назовем их Post, который содержит свойство IEnumerable<string> Tags { get; set; }.Enumerable Contains Enumerable

Мой вопрос:
Как использовать LINQ для запроса объектов, который содержит все теги из параметра теги?

private List<Post> posts = new List<Post>(); 

public IEnumerable<Post> GetPostsWithTags(IEnumerable<string> tags) 
{ 
    return ???; 
} 

ответ

4
public IEnumerable<Post> GetPostsWithTags(IEnumerable<string> tags) 
{ 
    return posts.Where(post => tags.All(tag => post.Tags.Contains(tag))); 
} 
3
return posts.Where(post => tags.All(post.Tags.Contains)) 
+0

Это возвращает список булевых, а не список сообщений. EDIT: ваше редактирование исправлено, теперь выглядит хорошо. – Jakob

+0

@Jakob - Хороший улов, спасибо. – Kobi

2

Во-первых, реализовать параметр в коллекции, так что вы не рискуете повторно quering, если это происходит, чтобы быть выражением, а не конкретный сбор, так как это может дать ужасно плохой производительности или даже не работать. A HashSet хорош для этого, так как вы можете быстро просматривать его.

Затем убедитесь, что все теги каждого элемента существует в наборе:

public IEnumerable<Post> GetPostsWithTags(IEnumerable<string> tags) { 
    HashSet<string> tagSet = new HashSet(tags); 
    return posts.Where(p => p.Tags.Count(t => tagSet.Contains(t)) == tags.Count); 
} 
1
var postsWithTags = posts. 
    Where(p => !tags.Except(p.Tags).Any()); 
Смежные вопросы