我有一个 List<T>
的 User
实例,我需要搜索 User
中的所有字段.
最有效的方法是什么?
这是我的 User
的定义类:
public class User
{
public String SamAccountName { get; set; }
public String EmailAddress { get; set; }
public String WorkPhone { get; set; }
public String MobilePhone { get; set; }
public String Office { get; set; }
}
我需要搜索以查看“Tom”的值是否包含在任何字段的任何字符串中并返回一个新的 List<T>
只有符合该条件的实例。
我想用 LINQ 来做这件事,但不知道怎么做。我该怎么做?
最佳答案
假设您有一个 IEnumerable<User>
,你可以这样做:
// Query for "Tom" being contained in any of the fields.
var query =
from user in users
where
(user.SamAccountName != null && user.SamAccountName.Contains("Tom")) ||
(user.EmailAddress != null && user.EmailAddress.Contains("Tom")) ||
(user.WorkPhone != null && user.WorkPhone.Contains("Tom")) ||
(user.MobilePhone != null && user.MobilePhone.Contains("Tom")) ||
(user.Office != null && user.Office.Contains("Tom"))
select user;
注意,检查 null
在这些字段中的任何一个为空的情况下很重要,否则,当您调用 Contains
method 时在 String
class 上它会抛出 NullReferenceException
因为没有字符串可以调用 Contains
上。
where
clause简单地映射到 Where
extension method在 Enumerable
class 上(确保有一个 using System.Linq;
声明,以便编译器识别扩展方法)。
如果您觉得 null 检查过多和/或重复,您可以像这样削减代码:
// Generate your predicate.
Func<string, bool> checkContainsTom = s => s != null && s.Contains("Tom");
// Query.
var query =
from user in users
where
checkContainsTom(user.SamAccountName) ||
checkContainsTom(user.EmailAddress) ||
checkContainsTom(user.WorkPhone) ||
checkContainsTom(user.MobilePhone) ||
checkContainsTom(user.Office)
select user;
这样稍微好一些,因为您封装了冗余逻辑;如果逻辑发生变化,您只需在一个地方进行更改,它将应用于所有检查。随意替换 lambda expression如果需要,可以使用一个函数。
然后您可以枚举 query
用 foreach
如果你想使用 deferred execution .如果您需要在物化列表中使用它(如 List<User>
),那么您只需调用 ToList
extension method在 Enumerable
上类,像这样:
IList<User> materializedResults = query.ToList();
关于c# - 在对象列表中搜索任何和所有匹配项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14266753/