web-dev-qa-db-ja.com

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

ありがとう!

21
Brian Low

このメソッドはすでに存在しています。それは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);
}
53
JaredPar

あなたが単一の青い車を探しているなら、ジャレッドは正しいです、どんな青い車でも十分です。それはあなたが探しているものですか、それとも青い車のリストを探していますか?

最初の青い車:

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

青い車のリスト:

IEnumerable<Car> manyCars = cars.FindAll(car => car.Color.Equals("Blue"));
9
StyxRiver

Find(...)Where / Firstに置き換えることができます。

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

これは、述語が一致しない場合にnullを返します。

3
Aren