在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是昂贵的,我不想调用它三次。有没有办法让我在表达式中调用它一次?

在Func/lambda表达式中重用方法调用

是的,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)