对于方法,我有以下参数IEnumerable<string> tags
,并且要查询对象列表,我们称之为Post,其中包含属性IEnumerable<string> Tags { get; set; }
。
我的问题是:
如何使用linq从tags参数中查询包含 all 标记的对象?
private List<Post> posts = new List<Post>();
public IEnumerable<Post> GetPostsWithTags(IEnumerable<string> tags)
{
return ???;
}
答案 0 :(得分:4)
public IEnumerable<Post> GetPostsWithTags(IEnumerable<string> tags)
{
return posts.Where(post => tags.All(tag => post.Tags.Contains(tag)));
}
答案 1 :(得分:3)
return posts.Where(post => tags.All(post.Tags.Contains))
答案 2 :(得分:2)
首先,将参数实现到集合中,这样如果它恰好是表达式而不是具体集合,则不会冒险重新查询它,因为这可能会导致可怕的性能甚至无法工作。 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);
}
答案 3 :(得分:1)
var postsWithTags = posts.
Where(p => !tags.Except(p.Tags).Any());