我有一个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; }
}
Run Code Online (Sandbox Code Playgroud)
我需要搜索以查看"Tom"的值是否包含在任何字段中的任何字符串中,并返回一个List<T>仅包含与该条件匹配的实例的new .
我想用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;
Run Code Online (Sandbox Code Playgroud)
注意,null如果这些字段中的任何一个为空,则检查很重要,否则,当您在类上调用该Contains方法时,它将抛出一个,因为没有字符串可以调用on.StringNullReferenceExceptionContains
该where条款只是映射到Where扩展方法的Enumerable类(确保有一个using System.Linq;声明,使扩展方法是由编译器识别).
如果您认为空检查过多和/或重复,则可以减少代码,如下所示:
// 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;
Run Code Online (Sandbox Code Playgroud)
这稍微好一点,因为你正在封装冗余逻辑; 如果逻辑发生变化,您只需在一个地方更改它,它就会应用于所有检查.如果需要,可以随意使用函数替换lambda表达式.
然后,您可以query使用a 枚举,foreach如果要使用延迟执行.如果你需要在物化列表(如a List<User>)中,那么你只需在类上调用ToList扩展方法Enumerable,如下所示:
IList<User> materializedResults = query.ToList();
Run Code Online (Sandbox Code Playgroud)