linq findall有多个谓词

时间:2014-09-07 09:53:06

标签: c# linq predicates

在C#中,我有一个带有name和surname属性的对象,并创建了这些对象的列表List<person>

我想基于姓名和姓氏来过滤这个List<person>,但是在列表中有些人可以将姓氏设为null,所以我只想在name不为null时过滤名称并且仅当姓氏不为空时才为姓。

我无法使用findall执行此操作,因为它只接受谓词

m_cPersons.FindAll(q => q.Name != null && q.Name.ToUpper().Contains(name)); 

如何添加两个谓词?

2 个答案:

答案 0 :(得分:2)

使用LINQ List<T>.FindAll(...)扩展方法:

,而不是Where(Func<TSource,bool> predicate)方法
m_cPersons.Where(q => q.Name != null && q.Name.ToUpper().Contains(name));

答案 1 :(得分:1)

如果我正确理解了这个问题,您可以使用FindAll实现基于名称和姓氏的过滤:

m_cPersons.FindAll(q =>
    (q.Name == null ||
        q.Name.IndexOf(name, StringComparison.OrdinalIgnoreCase) >= 0)
    &&
    (q.LastName == null ||
        q.LastName.IndexOf(lastName, StringComparison.OrdinalIgnoreCase) >= 0)
);

使用IndexOf(... StringComparison.OrdinalIgnoreCase)ToUpper().Contains(...)更可靠(参见Case insensitive 'Contains(string)')。