检查列表框中的项目忽略大小写

时间:2017-12-13 13:15:45

标签: string vb.net listbox case-insensitive

有一些代码的问题,旨在为列表框添加电子邮件别名。我有一个内置的检查,以确保您尝试添加的项目不在列表中,但检查是区分大小写,当我不希望它。我不知道如何让它忽略这个案例......这是我的代码:

Dim ItemToAdd as String = ""

ItemtoAdd = tbxItemtoAdd.Text + "@emaildomain.co.uk"

If Not lbxEmailAliases.Items.Contains(ItemtoAdd) Then
    lbxEmailAliases.Items.Add(ItemtoAdd)
End If

目前,如果列表框中包含 johnsmith24 @ emaildomain.co.uk,并且您尝试添加 Johnsmith24 (大写J),则会成功添加此内容,但我不希望它那样做。如何让它忽略大小写?

我已尝试将lbxEmailAliases.Items.Contains(ItemtoAdd)更改为lbxEmailAliases.Items.Contains(ItemtoAdd, StringComparison.CurrentCultureIgnoreCase),但由于参数太多而不满意,因此对此不满意。

有什么想法吗?

3 个答案:

答案 0 :(得分:5)

如果这是一个标准的WinForm ListBox控件,那么没有循环遍历所有项目并单独检查每个项目就无法做到这一点。例如:

Dim found As Boolean = False
For Each item As Object In ListBox1.Items
    found = item.ToString().Equals(ItemToAdd, StringComparison.CurrentCultureIgnoreCase)
    If found Then
        Exit For
    End If
Next
If found Then
    lbxEmailAliases.Items.Add(ItemtoAdd)
End If

但是,如果你对LINQ感到满意,你可以更简洁地这样做:

If ListBox1.Items.OfType(Of String).Any(Function(item) item.Equals(ItemToAdd, StringComparison.CurrentCultureIgnoreCase)) Then
    lbxEmailAliases.Items.Add(ItemtoAdd)
End If

或者,正如Andy G指出的那样,LINQ Contains方法更容易,因为它接受IEqualityComparer,并且框架提供了支持不区分大小写的字符串比较的库存:

If ListBox1.Items.OfType(Of String).Contains(ItemToAdd, StringComparer.CurrentCultureIgnoreCase) Then
    lbxEmailAliases.Items.Add(ItemtoAdd)
End If

答案 1 :(得分:4)

应该是StringComparer,而不是StringComparison

lbxEmailAliases.Items.Contains(ItemtoAdd, StringComparer.InvariantCultureIgnoreCase)

该方法接受IEqualityComparerthe docs

正如Steven Doggart所指出的,ListBox项目需要使用OfType(Of T):

lbxEmailAliases.Items.OfType(Of String).Contains(ItemtoAdd, StringComparer.InvariantCultureIgnoreCase)

答案 2 :(得分:2)

替代方案可以是FindString - 方法:

If lbxEmailAliases.FindString(ItemtoAdd) = ListBox.NoMatches Then
    lbxEmailAliases.Items.Add(ItemtoAdd)
End If

注意:此方法搜索以指定字符串开头的项目,并返回找到的第一个项目的索引。 表示即使现有的电子邮件地址为jdoe@domain.com,它也会找到jdoe@domain.computer.com
因此,对于您的具体情况,这可能不是最佳解决方案。

修改
您可以使用FindStringExact代替。像这样,你会得到想要的不区分大小写的非局部比较。

If lbxEmailAliases.FindStringExact(ItemtoAdd) = ListBox.NoMatches Then
    lbxEmailAliases.Items.Add(ItemtoAdd)
End If