Могу ли я следовать любой простой синаксии или правилам для создания «лямбда-выражения» в C#? Я прочитал несколько статей и понял, что такое лямбда-выражение, но если у меня есть общий синтаксис или правила, которые были бы полезны.Яркое выражение выражения синтаксиса
ответ
Выражение лямбда, в основном, сокращенное обозначение для указателя функции. Чаще всего, лямбда-выражение представляет собой распространение входных данных в выражение, которое вычисляет результат. В большинстве случаев вы будете использовать лямбда-выражения в их более общей форме:
int[] numbers = new[] { 1, 3, 11, 21, 9, 23, 7, 4, 18, 7, 7, 3, 21 };
var twentyoneCount = numbers.Where(n => n == 21).Count();
var sumOfgreaterThanSeven = numbers.Sum(n => n > 7 ? n : 0);
В их менее общей форме, лямбда-выражение может заменить более громоздкие делегата формы:
myButton.Click += new EventHandler(myButton_Click);
// ...
void myButton_Click(object sender, EventArgs e)
{
// TODO: Implement button click handler here
}
Или менее распространенные, и менее многословным:
myButton.Click += delegate(object sender, EventArgs e)
{
// TODO: Implement button click handler here
};
следующее выражение лямбда достигает того же результата, что и выше двух:
myButton.Click += (s,e) =>
{
// TODO: Implement button click handler here
};
Сила этой последней формы действительно связана с ее способностью создавать замыкания. Затвор где вы реализуете функцию внутри функции, и «закрыть» вокруг параметров и переменных из родительской области видимости функции:
private void DoSomething(IList<string> input, SomeObject source)
{
source.OnSomeEvent += (s,e) => return input.Sum();
}
Есть несколько способов выражения лямбды, в зависимости от конкретного сценария - некоторые примеров:
// simplest form; no types, no brackets
Func<int, int> f1 = x => 2 * x;
// optional exlicit argument brackets
Func<int, int> f2 = (x) => 2 * x;
// optional type specification when used with brackets
Func<int, int> f3 = (int x) => 2 * x;
// multiple arguments require brackets (types optional)
Func<int, int, int> f4 = (x, y) => x * y;
// multiple argument with explicit types
Func<int, int, int> f5 = (int x, int y) => x * y;
подпись лямбда должна соответствовать сигнатуре делегата, используемого (будь то явно, как выше, или вытекает из контекста в вещах, как .Select(cust => cust.Name)
Вы можете использовать лямбды без аргументов, используя пустой список выражений:
// no arguments
Func<int> f0 =() => 12;
В идеале, выражение в правой части является точно, что; одно выражение. Компилятор может преобразовать это либоdelegate
илиExpression
дерево:
// expression tree
Expression<Func<int, int, int>> f6 = (x, y) => x * y;
Однако; Вы можете также использовать операторные блоки, но это только тогда использовать в качестве delegate
:
// braces for a statement body
Func<int, int, int> f7 = (x, y) => {
int z = x * y;
Console.WriteLine(z);
return z;
};
Обратите внимание, что даже при том, что .NET 4.0 Expression
деревья поддержки выписки тела, C# 4.0 компилятор не сделать это для вы, поэтому вы по-прежнему ограничены простыми деревьями Expression
, если вы не сделаете это «трудным путем»; см. my article on InfoQ для получения дополнительной информации.
- 1. Яркое выражение слишком сложное для шаблона редактора
- 2. Ошибка синтаксиса регулярного выражения
- 3. Ошибка выражения синтаксиса выражения
- 4. Ошибка выражения синтаксиса выражения
- 5. Ошибка синтаксиса выражения майя
- 6. Проверка синтаксиса выражения XPath
- 7. Яркое выражение возвращается в анонимный класс в студии Android
- 8. выражение выражения выражения regex
- 9. выражение выражения регулярного выражения
- 10. Ошибка синтаксиса регулярного выражения Python
- 11. Яркое выражение не верно - нужно вернуть boolean Func
- 12. Подтверждение синтаксиса регулярного выражения Boost
- 13. Выражения запроса для синтаксиса лямбда?
- 14. Другая ошибка синтаксиса, вставить выражение «AssignmentOperator Expression» для завершения выражения
- 15. Выражение выражения
- 16. Ошибка синтаксиса выражения массива
- 17. Ошибка синтаксиса выражения
- 18. Профилактика синтаксиса выражения «IF»
- 19. выражение выражения отрицательного выражения ASP.NET
- 20. выражение выражения регулярного выражения Python
- 21. Выражение выражения регулярного выражения Sed?
- 22. Выражение выражения регулярного выражения Java?
- 23. Entity Framework 7 Яркое выражение для трех табличных соединений
- 24. Регулярное выражение для синтаксиса синтаксиса xaml binding-esque
- 25. Ошибка: (195) выражение синтаксиса
- 26. C# Выражение синтаксиса
- 27. выражение дает ошибку синтаксиса
- 28. Spring AOP Pointcut синтаксиса выражения для шаблона
- 29. Яркое сравнение кода размера
- 30. Яркое изображение Java
Отлично. Это точно взяло меня в реальный мир программирования. Thousand спасибо jrista – user184805
«Лямбда-выражение, в основном, сокращенное обозначение для указателя функции». Не обязательно. Важным отличием и важной особенностью лямбда является способность рассматривать их как данные (деревья выражений), а не код (анонимные методы). Http: // StackOverflow.com/questions/793571/why-would-you-use-expressionfunct-rather-than-funct/793584 # 793584 –
@Mehrdad: Правда, lambdas действительно становятся деревьями выражений. Однако конечный результат вычисления дерева выражений оценивает динамический метод, на который указывает делегат. Дерево выражений - это просто промежуточное представление конечного указателя функции. Обратите внимание на метод .Compile(), который возвращает делегат: http://msdn.microsoft.com/en-us/library/bb345362.aspx – jrista