使用 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# 中的属性值搜索嵌套在另一个列表中的列表中的项目?