gpt4 book ai didi

c# - 在对象列表中搜索任何和所有匹配项

转载 作者:太空狗 更新时间:2023-10-29 22:23:12 26 4
gpt4 key购买 nike

我有一个 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 methodEnumerable 上类,像这样:

 IList<User> materializedResults = query.ToList();

关于c# - 在对象列表中搜索任何和所有匹配项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14266753/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com