List.Add 正在替换索引 0 而不是添加到下一个位置。为啥?

Posted

技术标签:

【中文标题】List.Add 正在替换索引 0 而不是添加到下一个位置。为啥?【英文标题】:List.Add is replacing index 0 instead of adding to the next position. Why?List.Add 正在替换索引 0 而不是添加到下一个位置。为什么? 【发布时间】:2021-12-24 23:11:23 【问题描述】:

我正在使用 ASP.NET 和 Visual Basic 制作一个自定义表单,用于填写信息。单击按钮后,将调用一个函数,该函数从该表单中获取位信息,将它们放入一个对象中,然后将该对象添加到列表中。这被用于一种排队输入系统,因此表单将被多次编辑和提交。

由于某种原因,它没有在列表的下一个索引位置添加新对象,而是替换了 0 处的任何内容。因此,当时列表中只有一个对象。

这是自定义表单:

这是我的自定义对象,目前位于我的 _Default 类之上:

Public Class QueueItem

    Public Property _TestName As String
    Public Property _ValueID As String
    Public Property _MathOperator As String
    Public Property _ValueInput As Integer

    Public Sub New()
    End Sub

    Public Sub New(ByVal TestName As String, ByVal ValueID As String, ByVal MathOperator As String, ByVal ValueInput As Integer)
        _TestName = TestName
        _ValueID = ValueID
        _MathOperator = MathOperator
        _ValueInput = ValueInput
    End Sub

End Class

该列表在我的 Page_Load 函数上方、_Default 类中声明,并且是公共的。这是该列表的定义:

Public QueueList As List(Of QueueItem) = New List(Of QueueItem)()

而且,按下“添加到队列”按钮时会调用以下内容:

Protected Sub AddToQueueButton_Click(sender As Object, e As EventArgs) Handles AddToQueueButton.Click

        'Adds a new QueueItem to the QueueList
        'Values pulled from the dropdown lists in the custom form

        QueueList.Add(New QueueItem() With 
            ._TestName = TestName.SelectedValue,
            ._ValueID = ValueID.SelectedValue,
            ._MathOperator = MathOperator.SelectedValue,
            ._ValueInput = ValueInput.Text
        )

        'Below section is for testing

        Dim test1 As String = QueueList(0)._TestName
        Dim test2 As String = QueueList(0)._ValueID
        Dim test3 As String = QueueList(0)._MathOperator
        Dim test4 As String = QueueList(0)._ValueInput

        Dim testmessage As String = test1 + " | " + test2 + " | " + test3 + " | " + test4
        Dim count = QueueList.Count
        Dim capacity = QueueList.Capacity

        Response.Write("<script language='javascript'>alert('" + testmessage + "');</script>")

End Sub

所以,如您所见,我有一些测试变量和东西,我正在使用它们来确保它正常工作。每次调用它时,都会将一个对象添加到列表中,我会查看列表的计数和容量,并在警报中显示所有信息。

警报的此信息始终从索引 0 读取。因此,我向列表添加信息多少次都无关紧要,0 应该保持不变,对象应该添加到 1,然后是 2,然后很快。对吧?

好吧,每当我提交新信息时,都会发生 0 次更改,并且计数或容量都不会超过第一个条目。它们总是显示为好像列表中只有一项。

这是我两次运行队列输入表单,最后有两个不同的数字:

第一次运行:

第二次运行:

因为我总是从索引 0 读取,所以最后的数字不应该改变。它应该给我与索引 0 处的对象关联的数字。而且,List.Add 函数应该使计数和容量增加。但是,这一切都没有发生。相反,它似乎正在替换 0 时的内容。

如果有人对如何解决此问题有任何提示,或者可以提示我可能会发生什么,将不胜感激。

【问题讨论】:

公共属性以下划线开头是非常不寻常的。为什么忽略带参数的构造函数? @LarsTech 我复制了一些代码,并遵循了该约定。老实说,我并不完全理解创建新对象并为其添加参数应该如何工作。这就是我展示对象类的原因,因为如果存在错误,我可能需要知道这一点。感谢您的评论! 【参考方案1】:

每次向您的页面发出请求时,都会创建一个新的类实例来处理该请求。对于回发请求,可能会加载一些数据——例如,发布到服务器的字段的值,以及存储在ViewState 中的任何内容。但是存储在页面字段中的数据不会跨请求保留。

代码没有替换索引0处的项目;这是添加一个项目到一个空列表。

您需要以某种方式在请求之间保留您的列表。您可以将其存储在Session 中,也可以将其放在ViewState 中。

【讨论】:

啊,有道理!谢谢您的回答!我一定会试一试,如果有其他东西爆炸,我会回来的。

以上是关于List.Add 正在替换索引 0 而不是添加到下一个位置。为啥?的主要内容,如果未能解决你的问题,请参考以下文章

Python:无法替换列表中的项目,原因是:TypeError:列表索引必须是整数或切片,而不是 str

将list集合中部分元素替换成指定元素该怎么做

java 中如何打印一个List集合的索引

用元素名称替换索引,保持名称的顺序而不是索引的顺序

替换而不是将项目添加到 Arraylist

使用导航架构组件添加(而不是替换)片段