Создать 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 в случае, если предикат не соответствует.