linq 操作员“||“在lambda表达式中无法正常工作

rryofs0p  于 2022-12-06  发布在  其他
关注(0)|答案(1)|浏览(150)

在下面的代码中,即使第一部分已经返回“true”,过滤器的第二部分仍在执行。||如果第一部分为真,则运算符不应执行验证的第二部分。

List<data> query = new List<data>();

        query.Add(new data { name = "John", surname= "Mazi" });
        query.Add(new data { name = "Joseph", surname= "Doe" });
        query.Add(new data { name = "Paul", surname= "Allen" });
        query.Add(new data { name = "John", surname = "Doe" });

        data filters = new data { name = "John", surname = "Doe" };

        List<data> data = query.Where(x => ((x.name.Trim().ToUpper() == filters.name.Trim().ToUpper()
                                                & x.surname.Trim().ToUpper() == filters.surname.Trim().ToUpper())
                                        ||
                                             (x.name.Trim().ToUpper().Contains(filters.name.Trim().ToUpper())
                                                | x.surname.Trim().ToUpper().Contains(filters.surname.Trim().ToUpper())))).ToList();

在上面的示例中,它应该只返回一个项目,但它保持返回三个

pod7payv

pod7payv1#

你对or运算符的理解是正确的,但是你必须考虑到,你的验证将对列表中的每个条目执行。记住这一点,如果你进行验证,你会明白为什么在这个例子中会返回三个数据集。为了可读性和易用性,我将把验证分成两部分:

List<data> data = query.Where(x => ((x.name.Trim().ToUpper() == filters.name.Trim().ToUpper()
                                                & x.surname.Trim().ToUpper() == filters.surname.Trim().ToUpper()).ToList();
//If no exact matches, get datasets where name/ surname is contained
if(!data.Any())
{
    data = query.Where(x => (x.name.Trim().ToUpper().Contains(filters.name.Trim().ToUpper())
                                                || (x.surname.Trim().ToUpper().Contains(filters.surname.Trim().ToUpper())).ToList();
}

这将首先尝试返回每个精确匹配,如果没有,则返回包含姓名的每个数据集。

相关问题