Jonvy

导航

C#中的delegate与Lambda表达式

参考:

Lambda 表达式和匿名函数

 什么是lambda 表达式?

C# 中的 lambda 表达式是一种匿名函数,可以用于简化代码,避免定义命名函数或委托。

lambda 表达式的语法如下:

(parameter1, parameter2, ...) => expression

lambda 表达式的示例:

C#
// 将一个数字加 1
Func<int, int> addOne = x => x + 1;

// 将两个数字相加
Func<int, int, int> add = (x, y) => x + y;

// 将一个字符串转换为大写
Func<string, string> toUpperCase = s => s.ToUpper();


lambda 表达式的应用场景如下:

  • 委托: lambda 表达式可以用于定义匿名委托,从而简化代码。
  • LINQ: lambda 表达式可以用于定义 LINQ 查询表达式,从而简化查询代码。
  • 事件处理程序: lambda 表达式可以用于定义事件处理程序,从而简化事件处理代码

LINQ:

Language Integrated Query的缩写,它是一种将查询功能直接集成到编程语言中的技术。

LINQ由微软开发,旨在为.NET Framework提供更高效的数据处理能力。它允许开发人员使用类似于SQL的语法来查询各种数据源,包括关系型数据库、XML文档、ADO.NET数据集以及自定义对象集合。这种技术极大地简化了数据查询的过程,因为它使用程序员熟悉的语言结构,而不是依赖于特定的数据库查询语言。

任何 Lambda 表达式都可以转换为委托类型。 Lambda 表达式可以转换的委托类型由其参数和返回值的类型定义。 如果 lambda 表达式不返回值,则可以将其转换为 Action 委托类型之一;否则,可将其转换为 Func 委托类型之一。

 

将以下代码改为不使用delegate:

_syncContext.Post(
delegate
{
AddListItem("System disconnected");
bool reset_gui = false;

if (!_closing && _autoconnect && cbAutoReconnect.Checked)
{
frmReconnecting frm = new frmReconnecting(this, _system);

if (frm.ShowDialog() == DialogResult.Cancel)
reset_gui = true;
}
else
{
reset_gui = true;
}

if (reset_gui)
{
btnConnect.Enabled = true;
btnDisconnect.Enabled = false;
btnTrigger.Enabled = false;
cbLiveDisplay.Enabled = false;

picResultImage.Image = null;
lbReadString.Text = "";
}
},
null);

不使用delegate:

_syncContext.Post(() =>
{
AddListItem("System disconnected");
bool reset_gui = false;

if (!_closing && _autoconnect && cbAutoReconnect.Checked)
{
frmReconnecting frm = new frmReconnecting(this, _system);

if (frm.ShowDialog() == DialogResult.Cancel)
reset_gui = true;
}
else
{
reset_gui = true;
}

if (reset_gui)
{
btnConnect.Enabled = true;
btnDisconnect.Enabled = false;
btnTrigger.Enabled = false;
cbLiveDisplay.Enabled = false;

picResultImage.Image = null;
lbReadString.Text = "";
}
}, null);

  • C#中的Lambda表达式:

csharp复制代码运行
// 定义一个Lambda表达式,用于过滤列表中的元素
List<int> numbers = new List<int> { 1, 2, 3, 4, 5 };
var evenNumbers = numbers.Where(x => x % 2 == 0);
// 输出结果
foreach (var number in evenNumbers)
{ Console.WriteLine(number); }
 

posted on 2024-03-07 10:27  不亮  阅读(18)  评论(0编辑  收藏  举报