синтаксис предложения выбора linq - PullRequest
2 голосов
/ 04 декабря 2011

Метод Linq Select принимает Func в качестве входного параметра.Это означает, что я могу иметь несколько операторов в селекторе для Select, например,

var myresult = sources.Select(s => 
     {int x; if (s.val = high) {x=1} else if (s.val = med) {x=2} else {x=3}; return x;
     }
  )

Как это сделать, используя синтаксис запроса Linq

var myresult = from s in sources
       select ...

Здесь код в части Func (если... еще, если .. еще) является искусственным.Что я действительно хочу знать, так это синтаксис предложения select, который может быть описан как

select select-expression

Что такое синтаксис

выражение выбора

Ответы [ 4 ]

2 голосов
/ 04 декабря 2011

Я бы не хотел видеть вашу первую версию в моем коде. Если вам нужно иметь то, что по сути является полной функцией лямбды, я бы предпочел, чтобы лямбда просто вызывала полную функцию! Другими словами ...

theQuery.Select(s => GetX(s)); // just define a GetX function

И это также был бы простой перевод к синтаксису выражения запроса

from s in sources
select GetX(s);

Вы не сможете поместить свой полный блок кода в синтаксис выражения запроса. Вы можете перевести данную логику в нечто полезное (но грязное), однако я вполне уверен, что ваш фрагмент - это просто общий пример. На самом деле это не так, вы можете попробовать

select s.val == high ? 1 : (s.val == med ? 2 : 3); // totally messy
0 голосов
/ 04 декабря 2011

MSDN указывает , выберите - это контекстное ключевое слово C # 4.0.Поэтому я проверил спецификацию языка C # 4.0.Его Выбор предложений раздел (7.16.2.5) указывает, что

Выражение запроса в форме
from x in e select v
переведено в
( e ) . Select ( x => v )
за исключением случаев, когда v является идентификатором x, перевод просто
( e )

В результате синтаксис для

select select-expresion

выражение-выбора должно быть любым, что можно использовать в качестве TResult в Выбрать Метод.Таким образом, функциональность может быть выполнена с использованием анонимного Func в методе Select , которого невозможно достичь с помощью select clause .

Вывод заключается в том, что вы должны придерживаться синтаксиса метода, поскольку именно так код действительно работает за сценой.

0 голосов
/ 04 декабря 2011

Вместо значений со специальным регистром, с if/else эквивалентом оператора switch, более удобен Linq для группировки и фильтрации ваших значений:

var myResult = from s in sources
               group by s.val into g
               select new { Val = g.Key, Sources = g };

var groupHigh = myResult.Where(i => i.Val == high);
var groupMedium = myResult.Where(i => i.Val == medium);
var groupOther = myResult.Except(groupHigh.Concat(groupMedium));

Обратите внимание, что приведенный мною код является лишь отправной точкой и не лучшим способом достижения вашей конкретной цели. Я бы решил это одним из следующих способов:

  • Изменить способ использования group by (используйте SomeFunction(s.Val) вместо прямого использования s.Val)
  • Измените код вокруг этого запроса, чтобы он лучше сочетался с естественными группировками, поэтому я не требовал преобразования групп
0 голосов
/ 04 декабря 2011

Это невозможно.

Если вы действительно хотите, вы можете создать Func<T> из анонимного метода и вызвать его, но это было бы ужасно.

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