Создать IEnumerable <T>.Find () - PullRequest
18 голосов
/ 04 июня 2010

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

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

Спасибо!

Ответы [ 3 ]

50 голосов
/ 04 июня 2010

Этот метод уже существует. Это называется 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);
}
9 голосов
/ 04 июня 2010

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

Первая голубая машина:

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

Список синих автомобилей:

IEnumerable<Car> manyCars = cars.FindAll(car => car.Color.Equals("Blue"));
3 голосов
/ 04 июня 2010

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

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

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

...