微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

选择作为方法参数

如何解决选择作为方法参数

在 C# 8 中,我有以下方法

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

我如何创建一个类似的 Verify 方法来用作:

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 转换为可以进行算术运算的可用数字。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。