Использовать лямбда-выражения в C#
Лямбда-выражения в основном представляют собой сокращенную нотацию для создания анонимного метода. Существует несколько форматов, самый простой из которых имеет следующий синтаксис.
x => expression
Здесь выражение представляет собой выражение, включающее переменную x. Например, следующий код определяет анонимную функцию, которая принимает параметр x и возвращает квадрат x.
x => x * x
Они называются лямбда-выражениями, потому что вещь справа от => оператор - это выражение, которое возвращает значение.
Следующий код показывает, как программа может передать этот анонимный метод в метод CalculateValue.
CalculateValue(x => x * x)
Чтобы это сработало, метод CalculateValue должен принимать в качестве параметра метод, который принимает число как параметр и возвращает другое число. Visual Studio отображает типы данных параметра x и возвращаемого результата. Следующий код показывает, как вы могли бы определить CalculateValue.
private void CalculateValue(Funcfunction) { ... }
В этом случае CalculateValue ожидает в качестве параметра метод, который принимает int в качестве параметра и возвращает float. Анонимный метод, показанный ранее, может удовлетворить эти требования.
Если вы хотите включить более одного параметра в лямбда-выражения, вы должны заключить параметры в круглые скобки. Например, следующий код показывает объявление метода CalculateValue, который ожидает в качестве параметра метода, который принимает два параметра int и возвращает float . р>
private void CalculateValue(Funcact) { ... }
Следующий код показывает, как программа может использовать лямбда-выражение для вызова этого метода.
CalculateValue((x, y) => x * y)
В этих примерах Visual Studio записывает типы данных параметров лямбда-выражения. Если вы не хотите использовать вывод, например, если вы хотите сделать код более удобным для чтения, вы можете включить типы данных параметров, как в следующем коде.
CalculateValue((int x, int y) => x * y)
Если вы включаете типы данных, они должны соответствовать ожидаемым методом CalculateValue. (Насколько я знаю, вы не можете явно указать тип возвращаемого значения, хотя вы можете сделать выражение справа, включая оператор трансляции, чтобы вы знали, какой тип данных он возвращает.)
Если вы включаете типы данных, они должны соответствовать ожидаемым методом CalculateValue. (Насколько я знаю, вы не можете явно указать тип возвращаемого значения, хотя вы можете сделать выражение справа, включая оператор трансляции, чтобы вы знали, какой тип данных он возвращает.)
...
// Нарисуем соответствующий граф. private void radF1_CheckedChanged(object sender, EventArgs e) { DrawGraph(delegate(float x, float y) {return x * x + x * y - y; }); } private void radF2_CheckedChanged(object sender, EventArgs e) { DrawGraph(delegate(float x, float y) { return (y - 1 / (x * x)); }); } private void radF3_CheckedChanged(object sender, EventArgs e) { DrawGraph(delegate(float x, float y) { double temp = y - Math.Pow(x * x, 1.0 / 3.0); return (float)(x * x + temp * temp - 1); }); } private void radF4_CheckedChanged(object sender, EventArgs e) { DrawGraph(delegate(float x, float y) { return (float)(y - 3 * Math.Cos(x) / x); }); }
В примере этой записи используется следующая версия кода, которая использует лямбда-выражения для определения своих анонимных методов.
// Нарисуем соответствующий граф. private void radF1_CheckedChanged(object sender, EventArgs e) { DrawGraph((float x, float y) => x * x + x * y - y); } private void radF2_CheckedChanged(object sender, EventArgs e) { DrawGraph((x, y) => (y - 1 / (x * x))); } private void radF3_CheckedChanged(object sender, EventArgs e) { DrawGraph((float x, float y) => (float)(x * x + (y - Math.Pow(x * x, 1.0 / 3.0)) * (y - Math.Pow(x * x, 1.0 / 3.0)) - 1) ); } private void radF4_CheckedChanged(object sender, EventArgs e) { DrawGraph((float x, float y) => (float)(y - 3 * Math.Cos(x) / x)); }
Это несколько короче, хотя его необычный синтаксис может быть более запутанным. Выражение лямбда, используемое radF3_CheckedChanged, особенно сложно, потому что оно длинное. В предыдущей версии использовалась промежуточная переменная, чтобы немного упростить вычисление.
Вам не нужно использовать лямбда-выражения. Вы можете использовать более длинный синтаксис для определения анонимных методов. На самом деле вам также не нужно использовать анонимные методы. Предусмотрены как анонимные методы, так и лямбда-выражения, поэтому вы можете сделать свой код более кратким, если хотите.
В следующем посте объясняется, как использовать оператор lambdas, который позволит программе упростить сложное выражение, используемое radF3_CheckedChanged.