在VB.NET中简化列表初始化

3

如何简化 List 的初始化,以消除重复的 New MyObject() With 和参数名称(如 Value1)?我需要创建50个对象的列表,因此需要大量重复的、潜在的不必要的代码。

我使用最新的Visual Studio 2019(16.2.3)。

Public Class MyObject
    Public Property Value1 As Int32
    Public Property Value2 As Int32
End Class

Dim Test As New List(Of MyObject) From {
    New MyObject() With {.Value1 = 1, .Value2 = 1},
    New MyObject() With {.Value1 = 2, .Value2 = 2},
    New MyObject() With {.Value1 = 3, .Value2 = 3}
}
1个回答

5
以下代码展示如何向通用的List类型添加扩展方法,以便可以使用集合初始化器添加类型为T的对象。该扩展方法使您能够使用缩短后的集合初始化器语法:
Imports System.Runtime.CompilerServices

Module MyExtensions_List

<Extension()>
Sub Add(ByVal list As List(Of MyObject), ByVal v1 As Integer, ByVal v2 As Integer)
    list.Add(New MyObject With {.Value1 = v1, .Value2 = v2})
End Sub

End Module

现在,您可以简单地将其用作:
Dim list1 = New List(Of MyObject) From { {1, 10}, {2, 20}, {3, 30} }
注意: Add 方法可以作为扩展方法使用,也可以显式地定义为要使用的类(此处为 MyObject)的普通公共方法!
参考资料:集合初始化器如何:创建一个由集合初始化器使用的 Add 扩展方法

工作得很好。然而,认为它应该作为语言和/或 .Net Framework 的一部分实现。在C#中是一样的吗? - Megrez7
1
@Megrez7:它作为语言的一部分实现(在VB.NET和C#中都是如此)。任何名为“Add”的方法或扩展方法都允许您在初始化其类的实例时使用语法From {{arg1,arg2,...},{...}}。因此,例如像Add(v1 As Integer, v2 As Integer, v3 As Integer)这样的方法允许您执行:From {{1, 2, 3},{6, 8, 4}}(等等)。 - Visual Vincent
1
@Megrez7,如果不使用Add方法,在C#中可以通过更短的代码实现:var cats = new List<Cat> { new Cat{ Name = "Sylvester", Age=8 }, new Cat{ Name = "Whiskers", Age=2 } }; 但是通过定义Add方法,最终的代码会更加简洁和简短! - S.Serpooshan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接