Создайте IEnumerable <T>.Find ()

Я хотел бы записать:

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);
}

Спасибо!

20
задан Brian Low 3 June 2010 в 20:46
поделиться

3 ответа

Этот метод уже существует. Он называется 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);
}
52
ответ дан 29 November 2019 в 22:47
поделиться

Джаред прав, если вы ищете одну синюю машину, любой синей машины будет достаточно. Это то, что вы ищете, или вы ищете список синих машин?

Первая синяя машина:

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

Список синих машин:

IEnumerable<Car> manyCars = cars.FindAll(car => car.Color.Equals("Blue"));
9
ответ дан 29 November 2019 в 22:47
поделиться

Вы знаете, что Find(...) можно заменить на Where / First

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

Это вернет null в случае, если предикат не совпадает.

3
ответ дан 29 November 2019 в 22:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: