Создать 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);
}
Спасибо!
Ответы
Ответ 1
Этот метод уже существует. Он называется 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);
}
Ответ 2
Джаред прав, если вы ищете синюю машину, любого синего автомобиля хватит. Это то, что вы ищете, или ищете список синих автомобилей?
Первый синий автомобиль:
Car oneCar = cars.FirstOrDefault(c => c.Color.Equals("Blue"));
Список синих автомобилей:
IEnumerable<Car> manyCars = cars.FindAll(car => car.Color.Equals("Blue"));
Ответ 3
Вы знаете, что Find(...)
можно заменить на Where / First
IEnumerable<Car> cars;
var result = cars.Where(c => c.Color == "Blue").FirstOrDefault();
Это вернет null
в случае, если предикат не соответствует.