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


228

说我有Customer一个有财产的班级FirstName。然后我有一个List<Customer>

LINQ可以用来Firstname = 'John'在一个语句中查找列表中是否有客户。.如何?

Answers:


459

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

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

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


24
Any很好,我想知道有多少开发人员什么时候应该使用Count?
理查德

12
您还可以执行不区分大小写的搜索:cus => cus.FirstName.Equals(“ John”,StringComparison.CurrentCultureIgnoreCase)
jmservera

1
我知道这是一个古老的问题,但是为什么不使用Exists方法呢?观察事物是否存在。
Blackunknown 2014年

6
因为并非所有集合都具有Exists,并且它不需要lambda表达式,而是我们要寻找的对象。
zvolkov 2014年

1
@zvolkov,为什么我的剃须刀建议我使用bool的任何想法都有= list.All(cus => cus.FirstName!=“ John”); 这是最佳选择吗?
古卢

105

zvolkov的答案是找出答案的理想选择 是否有这样的客户。如果以后需要使用客户,则可以执行以下操作:

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

我知道这不是您要问的问题,但我想我会优先考虑一个后续问题:)(当然,这只会找到第一个此类客户...要找到所有这些客户,只需使用普通where条款。)


7
我要指出的是,如果您发现自己突然好奇符合标准的客户,您可能会在以后进行调试时对此表示赞赏。
mqp,2009年

1
只是将这个答案提高了一点,我很喜欢SO社区采取的额外步骤,为问题/答案增加了更多。
barneymc 2014年

1
谢谢,它帮助了我,但有时我只是想得到bool结果,所以在那种情况下.Any还是在这里.FindIndex使用那是最快的
shaijut

1
@stom:基本上都是O(N)...它们只是线性搜索。
乔恩·斯基特

撞上这个。我喜欢您使用list.FirstOrDefault语法而不是执行list.Where()。FirstOrDefault的方式。
GunWanderer

25

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

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));

10

使用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")

这不会回答“是否”这样的条目存在的问题;它仅枚举值(如果确实存在)。需要一个额外的步骤来确定此枚举是否为非空。
杰森

然后将“何处”更改为“任何”。对我来说可能更哲理。我很少需要知道是否不关心它们是谁。@jmservera:你是对的。我放弃了LINQ,现在只使用Lambda。
克里斯·布兰德斯玛

当我说使用lambda调用在技术上仍在使用LINQ时,我并不是要学究。(特别是,您正在使用LINQ-to-Objects。)您只是在使用方法调用,而不是语言关键字。
Judah Gabriel Himango,2009年

这个答案与zvolkov的答案有何不同?
dotnetN00b 2012年

4

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

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

3
List<Customer> list = ...;
Customer john = list.SingleOrDefault(customer => customer.Firstname == "John");

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


2
如果有多个客户叫John,那将引发异常。
Jon Skeet

1
感谢您的评论。我将答案作为部分正确的示例。
M4N

在您确定存在1并且希望引发一个以上异常的情况下,它仍然是有效的,因此我认为没有删除它是很好的。
RichardOD

1

另一种可能性

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

4
在这种情况下,最好使用Any。
RichardOD

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.