创建IEnumerable <t> .Find()</t>

时间:2010-06-03 20:46:30

标签: c# extension-methods ienumerable

我想写:

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 个答案:

答案 0 :(得分:50)

此方法已存在。它被称为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);
}

答案 1 :(得分:9)

Jared是正确的,如果你正在寻找一辆蓝色的汽车,任何蓝色的汽车就足够了。这是你在找什么,或者你在寻找蓝色汽车清单?

第一辆蓝色车:

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

蓝色车辆清单:

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

答案 2 :(得分:3)

您知道Find(...)可以替换为Where / First

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

如果谓词不匹配,这将返回null