2010-04-07 1 views
1

Find()를 구현하지 않는 간단한 컬렉션에서 List.Find()를 사용하려고합니다. 내가 생각 순진 방법은, 그냥 같이) 목록을 포장하고 .Find을 (실행하는 것입니다List Find()를 구현하지 않는 간단한 컬렉션에서 List.Find()를 사용하는 방법?

이제
ICollection myCows = GetAllCowsFromFarm(); // whatever the collection impl. is... 
var steak = new List<Cow>(myCows).Find(moo => moo.Name == "La Vache qui Rit"); 

, 내가 알고 싶은 모든 1, C#을 -wise, 무엇을 이 포장 비용은 얼마입니까? 이 컬렉션을 기존 방식으로 '검색'하는 것이 여전히 더 빠릅니까?

둘째로, 더 똑똑하게 그 .Find()를 사용하는 것이 더 낫습니까?

건배!

답변

4

List<T>으로 작성한 경우 IEnumerable (즉, ICollection)으로 복사하면 콘텐츠가 복사됩니다. 이것은 비쌀 수 있습니다.

LINQ를 사용할 수 있습니까? 그렇다면 First 확장 메서드를 사용하면 처음으로 발견 된 일치 항목을 반환하거나 일치하는 항목이 없을 경우 예외를 throw합니다. 이것은 어떤 IEnumerable<T>에서 작동합니다 :

var cattle = GetAllCows(); 
var steak = cattle.First(moo => moo.Name == "La Vache qui Rit"); 

또한 모든 경기를 반환하는, Where를 사용할 수 있습니다

var cattle = GetAllCows(); 
var matches = cattle.Where(moo => moo.Name == "La Vache qui Rit"); 

Enumerable 클래스의 유용한 확장 메서드의 힙이있다. LINQ는 데이터베이스를위한 것이 아닙니다.

1

사용 Enumerable.Where는 :

var steak = myCows.Where(moo => moo.Name == "La Vache qui Rit"); 

이렇게하면 컬렉션의 전체 복사본 원가 계산하지 않는 장점이있다.

편집 : D' oh! @ Roger의 답변이 더 좋습니다.

0

이에 대한 LINQ를 사용할 수 있습니다

using System.Linq; 

... 

var steak = myCows.First(moo => moo.Name == "La Vache qui Rit"); 
0

난 그냥, WDYT를 예외를 방지 할 수있는 방법들에 .FirstOrDefault()의 사용을 추가 할 것입니다?

관련 문제