如何为VB.NET的List<T>编写泛型IFNotExistsAdd扩展方法
实现泛型的IFNotExistsAdd方法
我们可以通过扩展方法实现需求,兼顾通用性与你想要的调用逻辑,以下是完整实现:
1. 创建扩展方法模块
VB.NET中扩展方法必须定义在模块内,我们同时实现泛型通用版本和Connoisseur类型的便捷重载:
Module ListExtensions ''' <summary> ''' 泛型扩展方法:仅当列表中无符合条件元素时添加新元素 ''' </summary> <Extension> Public Sub IFNotExistsAdd(Of T)(ByVal source As List(Of T), ByVal item As T, ByVal uniquenessCheck As Func(Of T, Boolean)) If Not source.Any(uniquenessCheck) Then source.Add(item) End If End Sub ''' <summary> ''' Connoisseur类型专属重载:基于Name属性判断元素是否存在 ''' </summary> <Extension> Public Sub IFNotExistsAdd(ByVal source As List(Of Connoisseur), ByVal item As Connoisseur) source.IFNotExistsAdd(item, Function(c) c.Name = item.Name) End Sub End Module
2. 在按钮事件中使用方法
初始化列表并按需求调用IFNotExistsAdd:
Public Class Connoisseur Public Name As String Public Pieces As String End Class Private Sub Button26_Click(sender As Object, e As RibbonControlEventArgs) Handles Button26.Click Dim CS As New List(Of Connoisseur)() ' 初始化列表:添加{"test1","2"} CS.Add(New Connoisseur() With {.Name = "test1", .Pieces = "2"}) ' Name为test1的元素已存在,不会添加 CS.IFNotExistsAdd(New Connoisseur() With {.Name = "test1", .Pieces = "1"}) ' Name为test2的元素不存在,会添加 CS.IFNotExistsAdd(New Connoisseur() With {.Name = "test2", .Pieces = "1"}) ' 验证输出(可替换为UI展示逻辑) For Each c In CS Console.WriteLine($"{{""{c.Name}"",""{c.Pieces}""}}") Next End Sub
3. 预期输出
执行代码后将得到:
{"test1","2"} {"test2","1"}
说明
- 泛型版本可适配任意类型的
List,只需传入对应的存在性判断逻辑。 Connoisseur专属重载简化了调用,直接基于Name属性完成去重判断。
内容的提问来源于stack exchange,提问作者Relaxing
相关产品推荐
相关产品推荐

