如何在C#中过滤包含另一个列表的列表?

3

我有两个类通过一对多的关系相连:

public class Movie
{
    public int Id { get; set; }
    public string Title { get; set; }
    public string Synopsis { get; set; }
    public IList<Tag> Tags { get; set; }
}

public class Tag
{
    public int Id { get; set; }
    public string Name { get; set; }
}

如何查找包含给定字符串的所有电影?只要不深入标签就可以管理:

var result = movies.Where(m => m.Title.Contains(searchString) |
                               m.Synopsis.Contains(searchString));

这里是一些伪代码,只在我的梦中有效:

var result = movies.Where(m => m.Title.Contains(searchString) |
                               m.Synopsis.Contains(searchString) | 
                               m.Tags.Name.Contains(searchString)); 
                              // Cannot access Name property of Tags like this

怎样才是正确的做法?

1个回答

10
你无法访问标签的属性,因为你没有持有标签的引用,而是持有标签集合的引用。因此,你需要使用linq的.Any进行查询:

确定序列中是否存在任何元素满足条件。

所以:

var result = movies.Where(m => m.Title.Contains(searchString) |
                               m.Synopsis.Contains(searchString) | 
                               m.Tags.Any(t => t.Name.Contains(searchString)));

同时考虑使用||运算符代替|运算符。两者都执行逻辑OR,但前者会懒惰地执行(即一旦遇到true就停止)。了解更多信息:C# 'or' operator?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接