可枚举包含可枚举

时间:2010-06-07 08:50:53

标签: c# linq

对于方法,我有以下参数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 ???;
}

4 个答案:

答案 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());