【问题标题】:Searching if value exists in a list of objects using Linq使用 Linq 搜索值是否存在于对象列表中
【发布时间】:2009-07-01 19:58:04
【问题描述】:

假设我有一个类Customer,它有一个属性FirstName。然后我有一个List<Customer>

可以使用 LINQ 来查找列表中是否有一个客户在单个语句中使用 Firstname = 'John'.. 怎么样?

【问题讨论】:

    标签: c# linq


    【解决方案1】:

    LINQ 定义了一个非常适合解决这个确切问题的扩展方法:

    using System.Linq;
    ...
        bool has = list.Any(cus => cus.FirstName == "John");
    

    确保引用 System.Core.dll,这是 LINQ 所在的位置。

    【讨论】:

    • Any 好,不知有多少开发者该用 Any 时才用 Count?
    • 您也可以进行不区分大小写的搜索:cus => cus.FirstName.Equals("John", StringComparison.CurrentCultureIgnoreCase)
    • 我知道这是一个老问题,但我们为什么不使用 Exists 方法呢?看它是为了看事物是否存在。
    • 因为不是所有的集合都有Exists,而且它不采用lambda表达式,而是我们要寻找的对象本身。
    • @zvolkov,任何想法为什么我的 resharper 建议我使用 bool has = list.All(cus => cus.FirstName != "John");这是不是更优化?
    【解决方案2】:

    zvolkov 的回答是找出如果有这样的客户的完美答案。如果您之后需要使用客户,您可以这样做:

    Customer customer = list.FirstOrDefault(cus => cus.FirstName == "John");
    if (customer != null)
    {
        // Use customer
    }
    

    我知道这不是你要问的,但我想我会先发制人提出后续问题 :) (当然,这只会找到第一个这样的客户.. . 要找到所有这些,只需使用普通的where 子句。)

    【讨论】:

    • 我会指出,如果您发现自己突然好奇是哪个客户符合标准,您可能会喜欢稍后在调试时这样做。
    • 只是将这个答案提高一个,因为我喜欢 SO 社区采取额外步骤为问题/答案添加更多内容的方式。
    • 谢谢它帮助了我,但有时我只想得到bool 结果,所以在这种情况下.Any.FindIndex 使用here 这很快 ?
    • @stom:它们都是 O(N),基本上……它们只是线性搜索。
    • 把它搞砸了。我喜欢你使用 list.FirstOrDefault 语法而不是使用 list.Where().FirstOrDefault 的方式。
    【解决方案3】:

    以下问题的一个选项(如何找到可能有任意多个名字的客户):

    List<string> names = new List<string>{ "John", "Max", "Pete" };
    bool has = customers.Any(cus => names.Contains(cus.FirstName));
    

    或从类似列表的csv中检索客户

    string input = "John,Max,Pete";
    List<string> names = input.Split(',').ToList();
    customer = customers.FirstOrDefault(cus => names.Contains(cus.FirstName));
    

    【讨论】:

      【解决方案4】:

      使用 Linq 你有很多可能性,这里有一种不使用 lambdas:

      //assuming list is a List<Customer> or something queryable...
      var hasJohn = (from customer in list
               where customer.FirstName == "John"
               select customer).Any();
      

      【讨论】:

        【解决方案5】:
        customerList.Any(x=>x.Firstname == "John")
        

        【讨论】:

        • 这不回答“如果”这样的条目存在的问题;如果它们确实存在,它只是枚举值。需要一个额外的步骤来确定此枚举是否为非空。
        • 然后将 Where 更改为 Any。对我来说可能更哲学。我很少需要知道是否不关心它们是哪些。 @jmservera:你是对的。不久前我放弃了 LINQ,现在只使用 Lambda。
        • 当我说使用 lambda 调用在技术上仍然使用 LINQ 时,我并不是要迂腐。 (特别是,您使用的是 LINQ-to-Objects。)您只是使用方法调用而不是语言关键字。
        • 这个答案与 zvolkov 的有什么不同?
        • 这有帮助!谢谢。
        【解决方案6】:

        我在发现.Any()之前使用的技术:

        var hasJohn = (from customer in list
              where customer.FirstName == "John"
              select customer).FirstOrDefault() != null;
        

        【讨论】:

          【解决方案7】:
          List<Customer> list = ...;
          Customer john = list.SingleOrDefault(customer => customer.Firstname == "John");
          

          如果不存在名字为“John”的客户,john 将为空。

          【讨论】:

          • 如果多个客户被称为 John,则会引发异常。
          • 感谢您的评论。我将把答案作为一个部分正确的例子。
          • 它在你确定有 1 个并且你希望在超过一个时引发异常的情况下仍然有效,所以我认为你没有删除它是件好事。跨度>
          【解决方案8】:

          试试这个,希望对你有帮助。

           if (lstCustumers.Any(cus => cus.Firstname == "John"))
           {
               //TODO CODE
           }
          

          【讨论】:

          • 这与 8 年前接受的答案相同。请确保您的答案在所有答案中是唯一的。
          【解决方案9】:

          另一种可能性

          if (list.Count(customer => customer.Firstname == "John") > 0) {
           //bla
          }
          

          【讨论】:

          • 在这种情况下最好使用 Any。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-12-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-08-29
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多