在Func/lambda表达式中重用方法调用
本文关键字:方法 调用 表达式 Func lambda | 更新日期: 2023-09-27 17:49:21
首先让我说我不确定这个问题的标题是否有任何意义,但我不知道如何描述我的问题。
我有一个定义为 的类public static class NaturalSort<T>
该类有一个方法
public static IEnumerable<T> Sort(IEnumerable<T> list, Func<T, String> field)
基本上,它对给定一个返回要排序的值的函数的某个列表执行自然排序。我一直在用它来做任何我想要进行自然排序的东西。
通常我会这样写
sorted = NaturalSort<Thing>.sort(itemList, item => item.StringValueToSortOn)
现在我有一个例子,我想要排序的值不是项目的字段,而是对某个方法的调用
之类的sorted = NaturalSort<Thing>.sort(itemList, item => getValue(item))
现在如果我getValue返回一个对象而不是字符串呢?我需要做一些条件逻辑来得到字符串值
sorted = NaturalSort<Thing>.sort(itemList, item => getValue(item).Something == null ? getValue(item).SomethingElse : getValue(item).SomeotherThing)
这将工作,除了调用getValue是昂贵的,我不想调用它三次。有没有办法让我在表达式中调用它一次?
是的,lambdas可以有多行代码。
item =>
{
var it = getvalue(item);
return it.Something == null ? it.SomethingElse : it.SomeotherThing;
}
如果使用Func<T>
委托,请确保以这种语法返回值,虽然这在短语法中隐式处理,但您必须在多行语法中自己完成。
同样,你应该让你的Sort
方法成为一个扩展方法,你也不需要类上的类型参数,只需使用
public static IEnumerable<T> Sort<T>(this IEnumerable<T> list, Func<T, String> field)
@Femaref是100%,我只是想知道,为什么你不选择
sorted = NaturalSort<Thing>.sort(itemList, item => getValue(item))
.Select(item => item.Something == null ? item.SomethingElse : item.SomeotherThing)