【问题标题】:Select as a method parameter选择作为方法参数
【发布时间】:2021-03-24 20:58:51
【问题描述】:

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

我将传递点并定义哪个属性保存要在方法验证中使用的值

【问题讨论】:

  • 您给出的示例代码没有传递points...它只传递一个lambda表达式。不过,写一些东西来让你拥有Verify(points, x =&gt; x.Maximum) 是相当容易的。
  • 好久没写c#代码了。但是,我记得当我想做一些你想要的魔法时,我曾经使用Reflection
  • @JonSkeet 刚刚更正
  • 为什么叫Verify,什么是Result类型?
  • 你根本没有纠正我所指出的......

标签: c# c#-8.0


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2022-11-24
    • 2015-01-06
    • 1970-01-01
    • 1970-01-01
    • 2014-08-05
    • 1970-01-01
    • 1970-01-01
    • 2018-07-10
    • 1970-01-01
    相关资源
    最近更新 更多