我想写:
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);
}
谢谢!
答案 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
。