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

String 检查列表框中的项目忽略大小写,string,vb.net,listbox,case-insensitive,String,Vb.net,Listbox,Case Insensitive,设计用于向列表框添加电子邮件别名的代码有问题。我有一个内置的检查,以确保您尝试添加的项目不在列表中,但当我不希望它在列表中时,该检查区分大小写。我不知道如何让它忽略这个案子。。。这是我的密码: Dim ItemToAdd as String = "" ItemtoAdd = tbxItemtoAdd.Text + "@emaildomain.co.uk" If Not lbxEmailAliases.Items.Contains(ItemtoAdd) Then lbxEmailAli

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

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),它将成功添加此内容,但我不希望它这样做。我如何让它忽略这个案例

我已尝试将
lbxemailauses.Items.Contains(ItemtoAdd)
更改为
lbxemailauses.Items.Contains(ItemtoAdd,StringComparison.CurrentCultureIgnoreCase)
,但它对此不满意,因为参数太多,它只接受一个


有什么想法吗?

应该是
StringComparer
,而不是
stringcomparation

lbxEmailAliases.Items.Contains(ItemtoAdd, StringComparer.InvariantCultureIgnoreCase)
该方法接受一个
IEqualityComparer

正如Steven Doggart所指出的,列表框项目需要使用OfType(of T):


如果这是一个标准的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
,框架提供了支持不区分大小写字符串比较的stock方法:

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

另一种方法可以是-方法:

注意:此方法搜索以指定字符串开头的项,并返回第一个找到的项的索引。 意味着它将找到
jdoe@domain.com
即使现有电子邮件地址为
jdoe@domain.computer.com

因此,对于您的具体案例,这可能不是最好的解决方案

编辑:
您可以使用。这样,您将获得不区分大小写的非部分比较

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

但是,很好,值得一提的是,如果它是一个WinForm
列表框
,那么
Items
属性只实现
IEnumerable
,而不是
IEnumerable(Of T)
,因此大多数LINQ方法在调用
Of type(Of T)
Cast(Of T)
之后才可用。谢谢。(我使用字符串数组在LINQPad中进行了短暂的测试。)很好,我完全忘记了那个方法。实际上,如果使用
FindStringExact
它将找不到部分匹配。尽管名称有误导性,FindStringExact也不区分大小写。我想这是我对这些方法唯一关心的问题——对偶然的观察者来说,案例不敏感并不明显。好吧,这以及对比较的精确性质缺乏控制(例如,当前文化与不变文化)。@Stevendogart谢谢你的评论。我没有意识到
FindStringExact
是不区分大小写的,就像一个符咒!非常感谢你!
If lbxEmailAliases.FindString(ItemtoAdd) = ListBox.NoMatches Then
    lbxEmailAliases.Items.Add(ItemtoAdd)
End If
If lbxEmailAliases.FindStringExact(ItemtoAdd) = ListBox.NoMatches Then
    lbxEmailAliases.Items.Add(ItemtoAdd)
End If