Linq를 사용하여 객체 목록에 값이 있는지 검색


228

Customer속성 이있는 클래스가 있다고 가정 해보십시오 FirstName. 그리고 나는이 List<Customer>.

LINQ를 사용하여 목록 Firstname = 'John'에 단일 명세서 로 고객이 있는지 확인할 수 있습니까? 어떻게?

답변:


459

LINQ는이 정확한 문제를 해결하기에 완벽한 확장 방법을 정의합니다.

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

LINQ가있는 System.Core.dll을 참조하십시오.


24
좋은 점이 있습니다. Any를 사용해야 할 때 Count를 사용하는 개발자 수는 몇 명입니까?
RichardOD

12
기분이야 => cus.FirstName.Equals ( "존", StringComparison.CurrentCultureIgnoreCase) : 당신은 또한 케이스를 구분 검색 할 수있는
jmservera

1
나는 이것이 오래된 질문이라는 것을 알고 있지만 왜 Exists 방법을 사용하지 않습니까? 사물이 있는지 확인하기 위해 만들어졌습니다.
Blackunknown

6
모든 컬렉션에 Exist가있는 것은 아니며 람다식이 아니라 우리가 찾고있는 객체입니다.
zvolkov

1
@zvolkov, 내 resharper가 bool을 사용한다고 제안하는 아이디어는 = list.All (cus => cus.FirstName! = "John"); 이것이 더 최적입니까?
Gullu

105

zvolkov의 답변은 그러한 고객이 있는지 알아내는 완벽한 방법입니다. 나중에 고객 을 사용해야 하는 경우 다음 을 수행 할 수 있습니다.

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

나는 이것이 당신이 요구하는 것이 아니라는 것을 알고 있지만, 나는 후속 질문을 선취 할 것이라고 생각했습니다 :) (물론, 이것은 첫 번째 고객 만을 찾습니다 ... 정상 where조항.)


7
기준에 맞는 고객이 누구인지 궁금한 경우 나중에 디버깅과 관련하여이 작업을 수행 한 것에 대해 감사하게 생각할 수 있습니다.
mqp

1
SO 커뮤니티가 질문 / 답변에 더 많은 것을 더하기 위해 추가 단계를 밟는 방식을 좋아합니다.
barneymc

1
감사는 나에게 도움이,하지만 때로는 난 그냥 싶어 bool그래서이 경우, 결과 .Any또는 .FindIndex사용 여기에 빠른이다 ?
shaijut

1
@ stom : 둘 다 O (N)이며 기본적으로 선형 검색 일뿐입니다.
Jon Skeet

이것을 부딪 쳤다. list.Where (). FirstOrDefault 대신 list.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를 사용하면 람다를 사용하지 않는 많은 가능성이 있습니다.

//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")

이러한 항목이 "있는 경우"라는 질문에 대답하지 않습니다. 존재하는 경우 값을 열거합니다. 이 열거가 비어 있지 않은지 확인하려면 추가 단계가 필요합니다.
Jason Jason

그런 다음 위치를 임의로 변경하십시오. 아마도 더 철학적 일 것입니다. 나는 그들이 어느 것을 돌보지 않으면 알 필요가 거의 없습니다. @ jmservera : 당신이 옳았다. 나는 LINQ를 잠시 포기하고 이제 Lambda를 독점적으로 사용합니다.
Chris Brandsma

람다 호출을 사용하는 것이 여전히 기술적으로 LINQ를 사용한다고 말할 때 헛소리가 아닙니다. (특히, LINQ-to-Objects를 사용하고 있습니다.) 언어 키워드 대신 메소드 호출을 사용하고 있습니다.
유다 가브리엘 히 망고

이 답변은 zvolkov와 어떻게 다릅니 까?
dotnetN00b

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은 null입니다.


2
둘 이상의 고객이 John이라고 하는 경우 예외가 발생합니다 .
Jon Skeet

1
의견 주셔서 감사합니다. 대답을 부분적으로 올바른 예로 남겨 두겠습니다.
M4N

1이 있고 두 개 이상인 경우 예외를 발생시키려는 시나리오에서는 여전히 유효하므로 삭제하지 않은 것이 좋습니다.
RichardOD

1

또 다른 가능성

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

4
이 시나리오에서는 Any를 사용하는 것이 좋습니다.
RichardOD

1

이것을 시도하십시오, 그것이 당신에게 도움이되기를 바랍니다.

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

4
이는 8 년 전의 답변과 동일합니다. 귀하의 답변이 모든 답변 중에서 고유한지 확인하십시오.
Tony_Henrich
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.