повторно использовать вызов метода внутри выражения Func / lambda - PullRequest
2 голосов
/ 08 апреля 2011

Сначала позвольте мне сказать, что я не уверен, имеет ли смысл этот вопрос какой-либо смысл, но я не уверен, как сформулировать мою проблему.

У меня есть класс, определенный как

public static class NaturalSort<T>

У этого класса есть метод

public static IEnumerable<T> Sort(IEnumerable<T> list, Func<T, String> field)

По сути, он выполняет естественную сортировку по некоторому списку, учитывая Func, который возвращает значение для сортировки.Я использовал это для всего, что я хочу сделать естественной сортировкой.

Обычно я делал бы что-то вроде

sorted = NaturalSort<Thing>.sort(itemList, item => item.StringValueToSortOn)

Теперь у меня есть случай, когда значение, которое я хочуsort - это не поле элемента, а вызов некоторого метода

Что-то вроде

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 стоит дорого, и я не хочу вызывать его 3 раза.Есть ли способ, как я могу назвать это однажды внутри выражения?

Ответы [ 2 ]

5 голосов
/ 08 апреля 2011

Да, лямбды могут содержать несколько строк кода.

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)
0 голосов
/ 08 апреля 2011

@ Femaref на 100%, мне просто интересно, почему вы не пошли бы с

sorted = NaturalSort<Thing>.sort(itemList, item => getValue(item))
         .Select(item => item.Something == null ? item.SomethingElse : item.SomeotherThing)
...