Как я могу использовать `лямбда-выражение` в токенах` select` `запроса-выражения` в C # - PullRequest
0 голосов
/ 29 декабря 2018

Я хочу использовать lambda-expression в токенах select.Ниже приведен упрощенный пример:

  // Example-0; It is NOT compilable.
  var xs = from v in Enumerable.Range( 0, 4 ) select w => w;

Но пример не может быть скомпилирован.(Я использую C # -7.0 / .net Framework 4.7.2)

ошибка CS1942: тип выражения в select' clause is incorrect. Type inference failed in the call to Выбрать '

Я пробовал другойСилиларная схема ниже:

  // Example-1; It can compile.
  Func< int, int > f = w => w;
  var xs = from v in Enumerable.Range( 0, 4 ) select ( v, f );

Но в Примере-1 грязно, и он не может захватить значение в select токенах.

  // Example-2; It is NOT compilable.
  var xs = from v in Enumerable.Range( 0, 4 ) select w => w + v;

Как я могу его закодировать

Ответы [ 2 ]

0 голосов
/ 02 января 2019

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

При использовании синтаксиса методов ваши запросы будут просты:

var result = Enumerable.Range( 0, 4 ); // no select needed

Предполагая, что вы упростили свою задачу:

Func<int, int> f = x => 4*x*x - 2*x +8;
var result = Enumerable.Range(0,4).Select(x => f(x));

Другими словами: вычислить F (x) для каждого x в коллекции четырех целочисленных значений, начиная с 0.

или:

var result = Enumerable.Range(0,4).Select(i => 4*i*i - 2*i + 8;
0 голосов
/ 29 декабря 2018

Вы можете использовать такой синтаксис для выбора Func<int, int>:

var xs = from v in Enumerable.Range(0, 4) select new Func<int, int>(x => x + v);

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

xs.ToList().ForEach(x => MessageBox.Show(x(1).ToString()));
...