【问题标题】:Write Own "Add" Method For An Array为数组编写自己的“添加”方法
【发布时间】:2013-09-25 19:08:10
【问题描述】:

我想为已声明的数组编写一个 .Add 方法。

逻辑是,如果你编写这样的代码:

 Sub Main()

    Dim names(2) As String

    names(0) = "john"
    names(1) = "jane"
    names(2) = "mary"
End Sub

您可以调用 Add 方法并指定名称作为参数来添加元素。 具有额外元素的元素应添加 +1,然后是前一个最高索引。 所以在上面的情况下......如果你会说:

add(Liz)

那么输出一定是:

names(0) = "john"
names(1) = "jane"
names(2) = "mary"
names(3) = "Liz"

提前感谢

【问题讨论】:

  • 为什么不直接使用列表而不是数组?
  • 为什么需要数组?您是否需要能够使用数组语法访问它?喜欢这个Dim x As Integer = myArray(i)?如果是这样,那么 List(Of T) 就是这样工作的。
  • 谢谢!也很方便!和平福萨

标签: .net arrays vb.net visual-studio-2012 add


【解决方案1】:

您可以为字符串数组编写扩展方法,如下所示:

Public NotInheritable Class ArrayExtensions
    Private Sub New()

    End Sub

    <System.Runtime.CompilerServices.Extension> _
    Public Shared Sub Add(Of T)(theArray As T(), t As T)
        Dim newSize As Integer = theArray.Length + 1
        Array.Resize(theArray, newSize)
        theArray(newSize - 1) = t
    End Sub
End Class

然后你可以这样称呼它:

Dim SomeArray(5) as String
SomeArray.Add(SomeElementAsString)

不幸的是,虽然这可以满足您的使用需求,但该数组不是引用,因此在扩展方法中所做的更改被丢弃,因为它只是在处理副本。这就是为什么大多数人会推荐使用List(Of T),因为它内置了基于引用的Add 方法,但您不希望这样,所以您唯一的选择是:

Public NotInheritable Class ArrayUtilities
    Private Sub New()

    End Sub

    Public Shared Sub Add(Of T)(ByRef theArray As T(), t As T)
        Dim newSize As Integer = theArray.Length + 1
        Array.Resize(theArray, newSize)
        theArray(newSize - 1) = t
    End Sub
End Class

下面是如何使用上面的代码:

Dim SomeArray(5) as String
ArrayUtilities.Add(SomeArray, SomeElementAsString)

【讨论】:

    【解决方案2】:

    我找到了它。所以这是交易......

    因此,为了实现这一点,我们需要一个对象名称为 Employee 的类。 Employee 有成员,如 Name 作为字符串...和 ​​section 作为字符串...

    将其视为公司中的一名员工,该公司有一个名字......并且在一个单独的部门工作......

    代码在这里:

    Public Class Employee
    
        Public Property Name As String
        Public Property Section As String
    End Class
    

    当然现在是数组。在此示例中,我们将创建一个数组,该数组可以保存员工类型的不同对象。为此,我们将创建一个名为 EmployeeCollection 的类。当然,在那个类中,我们需要一个包含一个变量的字段,该变量包含一个employee(1)类型的对象数组 现在对于我想要添加项目的方法,我编写了子 AddItem 并带有一个employee(2) 类型的参数。

    Public Class EmployeeCollection
        Public Items As Employee() = {}                '(1)
        Public Sub AddItem(item As Employee)           '(2)
            ReDim Preserve Items(Items.Length)
            Items(Items.Length - 1) = item
        End Sub
    End Class
    

    现在为了建立和使用这段代码,我制作了一个控制台应用程序,并在 Module1 中 我在 Sub Main 中输入了我的代码。

    在那个 sub main 我们必须声明一个对象类型的变量employeeCollection。 这是必需的,因此我们可以访问 AddItem 以及 Items() 数组。在这种情况下,我称之为 anCollection (3)。

    当然,在我们添加一些 Employee 类型的对象之前,我们需要先创建它们。 这就是我制作employee1和employee2的原因。请注意,带有 .name 和 .section 的部分填充了 Employee(4) 类的成员。

    然后是时候调用 anCollection 和一个项目了。 我加了两个。

    那么最后一个任务是查看数组中的内容。如果你看起来不错,你可以看到对象存储在公共字段 Items 中

    所以我们需要通过对象anCollection来调用它。如果我们运行这个..我们将看到添加到列表中的所有对象。

    Module Module1
        Sub Main()
    
            Dim anCollection As New EmployeeCollection()        '(3)
    
    
            '(4)
            Dim employee1 As New Employee With {.Name = "John", .Section = "Reception"}
            Dim employee2 As New Employee With {.Name = "Maria", .Section = "Catering Services"}
    
            anCollection.AddItem(employee1)
            anCollection.AddItem(employee2)
            Console.WriteLine(anCollection.Items(0).Name & " " & anCollection.Items(0).Section)
    
            Console.WriteLine(anCollection.Items(1).Name & " " & anCollection.Items(1).Section)
    
            Console.ReadLine()
    
    
    
    
        End Sub
    End Module
    

    这正是我需要的……如果您不想使用列表,那就太好了

    当然更容易使用...的列表,但是如果您想按照自己的方式来做呢?使用这个和平福萨

    【讨论】:

      猜你喜欢
      • 2018-09-18
      • 2014-09-17
      • 1970-01-01
      • 2018-02-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-08
      • 1970-01-01
      相关资源
      最近更新 更多