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

标签 c# .net linq

我有一个 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/

相关文章:

c# - 在 C# 中运行 F# 代码 -(就像在 C# 中使用 Roslyn 的 C#)

c# - 如何为 Json.net 生成 json 对象的所有可能的 LINQ 字符串?

c# - 如何通过应用程序配置禁用 Raygun.io 客户端?

C# WebView 在 metro 中崩溃

c# - 无法让 XmlDocument.SelectNodes 检索我的任何节点?

c# - linq中的动态表名

c# - 为什么 Where 和 Select 的表现优于 Select?

c# - 从 NuGet 安装 Xamarin.Auth 时出错

c# - 自创建数据库以来,支持 '--Context' 上下文的模型已更改 - 但 db 是新的生产数据库

.net - 从 .Net 线程调用时 COM 调用挂起