2010-06-03 27 views
16

我想寫:創建的IEnumerable <T> .Find()

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

我能做到這一點與擴展方法?下面的失敗是因爲它遞歸調用它自己而不是調用IList.Find()。

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

謝謝!

回答

46

此方法已存在。這就是所謂的FirstOrDefault

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

如果你自己實現它,它看起來有點像這樣

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

感謝。沒有意識到這種超負荷存在。 – 2010-06-03 21:06:04

+0

好答案!我從來沒有意識到這種超載存在,並且已經添加了多餘的.Where(...)First()語句。 – jhappoldt 2010-06-03 21:25:45

3

你知道Find(...)可以通過Where/First

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

這會被替換如果謂詞不匹配,則返回null

+3

不需要在哪裏。 FirstOrDefault也將採用謂詞。 – Stephan 2010-06-03 20:55:32

+3

您可以直接在'FirstOrDefault()'上指定謂詞並將'Where()'留出。 – 2010-06-03 20:55:55

+0

啊,你是對的,忘了謂詞。 – Aren 2010-06-03 21:35:04

8

如果你正在尋找一輛藍色汽車,那麼Jared是正確的,任何藍色汽車都足夠了。這是你在找什麼,或者你在尋找一輛藍色汽車?

首先藍色車:

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

藍色汽車的清單:

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

謝謝,如果你正在尋找一輛藍色轎車: cars.Single(car => car.Color.Equals(「Blue」) – 2010-06-03 21:08:37

+0

單身是可以的,如果你保證在整個列表中只有一輛車。如果你有多輛汽車,或者根本沒有汽車,你會拋出一個InvalidOperationException。FirstOrDefault將返回你的藍色汽車,或者是默認類型(通常爲null)。如果沒有匹配的東西,首先會拋出一個異常謂詞。 – StyxRiver 2010-06-03 22:03:15

相關問題