Select 作为方法参数
Select as a method parameter
在 C# 8 中,我有以下方法:
public Result Verify(IEnumerable<Decimal> values) {
// Do something with values
}
和class:
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());
如何创建一个类似的 Verify
方法,我可以将其用作:
IEnumerable<Point> points = getDataPoints();
Result result = Verify(points => points.Maximum);
我会传递这些点并定义哪个 属性 保存要在方法 Verify
中使用的值
正如 Jon 所说,您正在操作的 sequence 和您正在对其应用的 filter 之间有一点分离.以下是您的 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
转换为可以对其进行算术运算的可用数字。
在 C# 8 中,我有以下方法:
public Result Verify(IEnumerable<Decimal> values) {
// Do something with values
}
和class:
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());
如何创建一个类似的 Verify
方法,我可以将其用作:
IEnumerable<Point> points = getDataPoints();
Result result = Verify(points => points.Maximum);
我会传递这些点并定义哪个 属性 保存要在方法 Verify
中使用的值正如 Jon 所说,您正在操作的 sequence 和您正在对其应用的 filter 之间有一点分离.以下是您的 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
转换为可以对其进行算术运算的可用数字。