在VB.net中,委托Action和Func,结合LINQ和Lambda表达式的应用

==标题==

|--------------------------------------------|
| 在VB.net中,委托Action和Func,结合LINQ和Lambda表达式的应用 |

==正文==

VB.NET 中,ActionFunc 是两种内置的泛型委托类型,它们与 LINQ 和 Lambda 表达式结合后,能极大简化集合操作、事件处理和异步编程。以下通过具体示例说明其应用场景和用法:


🔍 一、ActionFunc 的核心区别

说明

  • Action

    适用于无需返回结果的操作(如修改状态、输出日志)。

  • Func

    适用于需返回值的场景(如数据转换、条件判断)。


⚙️ 二、结合 LINQ 和 Lambda 的典型应用

1. **Func + LINQ 实现数据转换与筛选**
ruby 复制代码
Dim numbers() As Integer = {1, 2, 3, 4, 5}
' 使用 Func 和 Lambda 定义筛选条件Dim isEven As Func(Of Integer, Boolean) = Function(n) n Mod 2 = 0' 结合 LINQ Where 方法Dim evenNumbers = numbers.Where(isEven) ' 结果: {2, 4}
' 使用 Func 转换数据类型Dim toString As Func(Of Integer, String) = Function(n) $"数字: {n}"Dim numberTexts = numbers.Select(toString) ' 结果: {"数字: 1", "数字: 2", ...}
go 复制代码
vbnet

场景:数据清洗、类型投影。


2. **Func 实现聚合计算**
bash 复制代码
' 计算数组元素的和Dim sum As Func(Of Integer, Integer, Integer) = Function(acc, n) acc + nDim total = numbers.Aggregate(0, sum) ' 结果: 15
' 查找最大值Dim max = numbers.Aggregate(Function(a, b) If(a > b, a, b))
go 复制代码
vbnet

说明Aggregate 通过 Func 逐步合并集合元素。


3. **Action 处理集合元素**
sql 复制代码
' 遍历集合并打印Dim printNumber As Action(Of Integer) = Sub(n) Console.WriteLine($"输出: {n}")Array.ForEach(numbers, printNumber) ' 输出每个元素
' 多播委托:组合多个操作Dim logAndStore As Action(Of Integer) = Sub(n)    Console.WriteLine(n)    storage.Add(n) ' 假设 storage 是外部集合End SubArray.ForEach(numbers, logAndStore)
go 复制代码
vbnet

场景:批量处理、日志记录。


4. **Func 在分组和排序中的应用**
bash 复制代码
Dim persons = New List(Of Person) From {    New Person With {.Name = "Alice", .Age = 30},    New Person With {.Name = "Bob", .Age = 25}}
' 按年龄分组Dim groupByAge As Func(Of Person, Integer) = Function(p) p.AgeDim ageGroups = persons.GroupBy(groupByAge)
' 按姓名长度排序Dim orderByNameLength = persons.OrderBy(Function(p) p.Name.Length)
go 复制代码
vbnet

说明GroupByOrderBy 依赖 Func 提取关键值。


🚀 三、进阶应用场景

1. 异步编程
sql 复制代码
' 使用 Action 定义异步完成后的回调Dim callback As Action = Sub() Console.WriteLine("操作完成")Task.Run(Sub()           ' 模拟耗时操作           Threading.Thread.Sleep(1000)        End Sub).ContinueWith(Sub() callback.Invoke())
go 复制代码
vbnet
2. 动态查询条件
bash 复制代码
' 根据输入动态生成过滤条件Function CreateFilter(min As Integer) As Func(Of Integer, Boolean)    Return Function(n) n > minEnd Function
Dim filter = CreateFilter(3)Dim filtered = numbers.Where(filter) ' 结果: {4, 5}
go 复制代码
vbnet

💎 总结

  • **Action:侧重执行操作**,适合事件处理、集合遍历。

  • **Func:侧重生成结果**,适合 LINQ 查询、数据转换和聚合计算。

  • Lambda 表达式

    :简化委托的声明,使代码更紧凑(如 Function(n) n * n)。

  • LINQ 整合

    :通过链式调用(如 .Where(...).OrderBy(...))实现声明式数据处理。

通过组合这些特性,VB.NET 开发者能以极简的代码完成复杂的数据操作,同时提升可读性和维护性。

==The end==

==合集==

|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 在VB.NET中,什么是委托(Delegate) 在VB.net中,委托Action与Func的比较 |

====若有用,请转发免费学习====

关注看更多文章

相关推荐
flysh0514 分钟前
如何利用 C# 内置的 Action 和 Func 委托
开发语言·c#
逑之1 小时前
C语言笔记1:C语言常见概念
c语言·笔记·c#
福大大架构师每日一题3 小时前
2026年1月TIOBE编程语言排行榜,Go语言排名第16,Rust语言排名13。C# 当选 2025 年度编程语言。
golang·rust·c#
wangnaisheng3 小时前
【C#】gRPC的使用,以及与RESTful的区别和联系
c#
JosieBook3 小时前
【开源】基于 C# 和 Halcon 机器视觉开发的车牌识别工具(附带源码)
开发语言·c#
龙潜月七3 小时前
做一个背单词的脚本
数据库·windows·c#·aigc·程序那些事
寻星探路3 小时前
【Python 全栈测开之路】Python 基础语法精讲(一):常量、变量与运算符
java·开发语言·c++·python·http·ai·c#
故事不长丨4 小时前
深度解析C#文件系统I/O操作:File类与FileInfo类的核心用法与场景对比
c#·文件系统·file·fileinfo·i/o操作·i/o流
henreash5 小时前
Language-ext
c#·函数式编程
kylezhao20196 小时前
C#根据时间加密和防止反编译
java·前端·c#