2010-06-03 23 views
16

ben yazmak istiyorum:IEnumerable <T> .find oluştur()

IEnumerable<Car> cars; 
cars.Find(car => car.Color == "Blue") 

Bu uzantı yöntemleri ile başarmak miyim? IList.Find() işlevini çağırmak yerine, yinelemeli olarak kendisini çağıracağından, aşağıdaki hatalar başarısız olur.

public static T Find<T>(this IEnumerable<T> list, Predicate<PermitSummary> match) 
{ 
    return list.ToList().Find(match); 
} 

Teşekkürler!

cevap

46

Bu yöntem zaten mevcut. bunu kendiniz uygulamak için olsaydı biraz Sen Find(...)Where/First

IEnumerable<Car> cars; 
var result = cars.Where(c => c.Color == "Blue").FirstOrDefault(); 

Bu olacak ile değiştirilebilir biliyoruz bu

public static T Find<T>(this IEnumerable<T> enumerable, Func<T,bool> predicate) { 
    foreach (var current in enumerable) { 
    if (predicate(current)) { 
     return current; 
    } 
    } 
    return default(T); 
} 
+0

teşekkürler. Bu aşırı yükün var olduğunu bilmiyordum. –

+0

Harika Yanıt! Bu aşırı yükün var olduğunu ve gereksiz eklediğini hiç fark etmemiştim.Kim (...). First() ifadeleri. – jhappoldt

3

gibi görünecektir FirstOrDefault

cars.FirstOrDefault(car => car.Color == "Blue"); 

denir Yüklemenin eşleşmemesi durumunda null döndürün. Tek bir mavi araba arıyorsanız, herhangi bir mavi araba yeterli olacaktır.

+3

Nereye gerek yok. FirstOrDefault, aynı zamanda Predicate'i de alacak. – Stephan

+3

Doğrudan yüklemeyi 'FirstOrDefault() 'üzerinde belirtebilirsiniz ve' Where() 'yi terk edebilirsiniz. –

+0

Ah, haklısınız, yüklemeyi unutmuşsunuz. – Aren

8

Jared doğrudur. Aradığın şey mi yoksa mavi arabaların bir listesini mi arıyorsun?

İlk mavi araba: mavi otomobillerin

Car oneCar = cars.FirstOrDefault(c => c.Color.Equals("Blue")); 

listesi:

IEnumerable<Car> manyCars = cars.FindAll(car => car.Color.Equals("Blue")); 
+0

Tam olarak bir mavi araba arıyorsanız: cars.Single (araba => car.Color.Equals ("Mavi") –

+0

Tüm listede YALNIZCA bir araba olması garanti edilirse Tek sorun değil. Birden fazla arabanız varsa veya hiç otomobiliniz yoksa, bir InvalidOperationException atacaksınız.YeniOrDefault mavi arabanızı veya varsayılan türünüzü (genellikle boş) döndürecektir.İlk bir şey yoksa ilk bir istisna atar yüklem. – StyxRiver