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.