请求列表框第一项的第一个和第三个字符返回第二个和第四个



我使用以下代码获取列表框中选定的项目,然后从该项目中提取第一个和第三个字符:

Dim accent As String = accentlist.SelectedItem.ToString
Dim accent1 As String = accent.Substring(1, 1)
Dim accent2 As String = accent.Substring(3, 1)

列表框项目是在加载表单时从.txt文件中获得的,它们是:

A/AA/BA/CA/DA/E等等

这个想法是获得/之前的字母(accent1(和/之后的字母(accent2(,除了选择第一个项目时,它在所有情况下都能完美工作,在这种情况下,它返回/和空格,而不是A和A。

如果我在顶部插入一行TEST,将a/a移到第二行,代码将为TEXT和a返回E和T,为a/a返回应该的E和T。

Dim accent = accentlist.SelectedItem
Dim accent1 As Char = accent(1) 
Dim accent2 As Char = accent(3) 

有同样的问题。Msgbox(重音符号(显示正确的字符串。

初始代码如下:

Dim getaccents As IO.StreamReader
getaccents = IO.File.OpenText("accents.txt")
accentlist.Items.AddRange(getaccents.ReadToEnd.Split(vbNewLine))

更新:上面的代码是在每一行前面添加一个空格,与第一行不同,第一行在原始文件中不存在或在列表框中可见。

有什么想法吗?

几乎所有。NET数组、集合和列表是从零开始的。这意味着第一个元素/项目的索引为0,最后一个元素/项的索引比长度/计数少1。您的代码正在请求String中的第二个和第四个字符,因为它指定了索引1和3。第一个和第三个字符位于索引0和2处。

这种基于零的索引的原因是索引是从列表开头开始的偏移量。这在历史上是基于内存中的偏移量。如果你认为一个数字行和列表中的项目占据了整个数字之间的空间,那么第一个项目占据了0和1之间的空间。该项从0开始,从列表的开头偏移0位,因此其索引为0。

这可能看起来有违直觉,但如果你考虑到数据是如何在低级别存储的,那就不是真的了。如果你来自一种基于1的VB风格,但几乎整个编程世界都是基于0的,包括C#,这可能会让人感到困惑,所以微软采取了务实的方法,并将VB.NET与之相结合。一旦你习惯了,这就不是问题。

编辑:

下面是一个例子,展示了原理的作用:

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
For i = Convert.ToInt32("A"c) To Convert.ToInt32("Z"c)
ListBox1.Items.Add("A/" & Convert.ToChar(i))
Next
End Sub
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim selectedItem = CStr(ListBox1.SelectedItem)
Dim firstChar = selectedItem?.Substring(0, 1)
Dim thirdChar = selectedItem?.Substring(2, 1)
Console.WriteLine($"First: {firstChar}; Third: {thirdChar}")
End Sub

您会发现该代码将为每个项目显示正确的字符。注意,?.的使用不允许在不引发异常的情况下选择任何项目。

Dim accent = accentlist.SelectedItem.trim
Dim accent1 As Char = accent(1) 
Dim accent2 As Char = accent(3) 

添加.trim删除了不可见的前导空格。。

最新更新