Переключение оператора внутри перечисления. Как улучшить производительность? - PullRequest
0 голосов
/ 03 июля 2018

У меня есть список элементов, которые я хотел бы отсортировать с помощью Linq OrderByDescending. Сортировка передается как значение в оператор switch.

items.OrderByDescending((SomeObject)i => {
   switch(cond)
   {
      case "conditionA":
        return (float)i.MemberA;
      case "conditionB":
        return (long)i.MemberB;
      case "conditionC":
        return (int)i.MemberB;
   }})

Меня беспокоит производительность этого цикла. Есть ли способ предварительно определить возвращаемое значение и передать его в цикл один раз?

1 Ответ

0 голосов
/ 03 июля 2018

Вы можете переместить свой переключатель за пределы OrderByDescending метода. Просто определите лямбду как Func<SomeObject, float> и назначьте ее перед запросом linq:

Func<SomeObject, float> orderBy = null;
switch (cond)
{
    case "conditionA":
        orderBy = i => (float)i.MemberA;
        break;
    case "conditionB":
        orderBy = i => (float)i.MemberB;
        break;
    default:
        orderBy = i => (int)i.MemberC;
        break;
}

Теперь вы можете использовать эту лямбду в сортировке

var res = items.OrderByDescending(orderBy);

Если items равно IQueriable, вы можете изменить Func<...> на Expression<Func<...>>

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...