使用 Linq 搜索值是不是存在于对象列表中

Posted

技术标签:

【中文标题】使用 Linq 搜索值是不是存在于对象列表中【英文标题】: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'.. 怎么样?

【问题讨论】:

【参考方案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。

以上是关于使用 Linq 搜索值是不是存在于对象列表中的主要内容,如果未能解决你的问题,请参考以下文章

使用 LINQ 根据 C# 中的属性值搜索嵌套在另一个列表中的列表中的项目?

如何使用 linq 检测一个集合字段是不是存在于另一个列表中?

根据以数组形式存在于对象值内的值搜索对象数组

在 Linq 中使用另一个列表中的项目搜索列表

在 LINQ to SQL 中使用 contains()

使用 Perl 在列表列表中搜索项目