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