问题描述
public Result Verify(IEnumerable<Decimal> values) {
// Do something with values
}
和类:
public class Point {
public Decimal Maximum { get; set; }
public Decimal Minimum { get; set; }
}
我使用它如下:
IEnumerable<Point> points = getDataPoints();
Result result = Verify(points.Select(x => x.Maximum).ToList());
IEnumerable<Point> points = getDataPoints();
Result result = Verify(points => points.Maximum);
解决方法
正如 Jon 所说,您正在操作的序列与您正在应用的过滤器之间存在一些区别。您的 Verify
函数应如下所示:
public static Result Verify<TItem,TValue>(this IEnumerable<TItem> source,Func<TItem,TValue> filter)
{
// do whatever here to decide your result
}
要使用它,您需要执行以下操作(请注意这与常规的 Linq 扩展方法有多么相似):
var result = points.Verify(p => p.Maximum);
这里有一个注意事项:我强烈建议尝试在扩展方法中去掉 TValue
并尽可能使用您的最终类型,即使代价是为这。 C# 的鸭子类型比 C++ 弱得多(或者相反,它的类型安全性要强得多),您会发现自己无法直接将 TValue
转换为可以进行算术运算的可用数字。