检查列表框中的项目忽略大小写
Checking for Item in a List Box Ignoring Case
用于将电子邮件别名添加到列表框的一些代码存在问题。我有一个内置的检查以确保您尝试添加的项目不在列表中,但是当我不希望它出现时,检查是区分大小写的。我不确定如何让它忽略大小写...这是我的代码:
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)
但我对此并不满意,因为参数太多,只需要一个。
有什么想法吗?
应该是StringComparer
,不是StringComparison
:
lbxEmailAliases.Items.Contains(ItemtoAdd, StringComparer.InvariantCultureIgnoreCase)
该方法接受 IEqualityComparer
、the docs。
正如 Steven Doggart 所指出的,ListBox 项需要使用 OfType(Of T):
lbxEmailAliases.Items.OfType(Of String).Contains(ItemtoAdd, StringComparer.InvariantCultureIgnoreCase)
如果这是一个标准的 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
另一种方法是 FindString
方法:
If lbxEmailAliases.FindString(ItemtoAdd) = ListBox.NoMatches Then
lbxEmailAliases.Items.Add(ItemtoAdd)
End If
注意:此方法搜索以指定字符串开头的项目,returns 第一个找到的项目的索引。
意味着它会找到 jdoe@domain.com
,即使现有的电子邮件地址是 jdoe@domain.computer.com
。
所以对于您的具体情况,这可能不是最佳解决方案。
编辑:
您可以改用FindStringExact
。像这样你会得到想要的不区分大小写的非部分比较。
If lbxEmailAliases.FindStringExact(ItemtoAdd) = ListBox.NoMatches Then
lbxEmailAliases.Items.Add(ItemtoAdd)
End If
用于将电子邮件别名添加到列表框的一些代码存在问题。我有一个内置的检查以确保您尝试添加的项目不在列表中,但是当我不希望它出现时,检查是区分大小写的。我不确定如何让它忽略大小写...这是我的代码:
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)
但我对此并不满意,因为参数太多,只需要一个。
有什么想法吗?
应该是StringComparer
,不是StringComparison
:
lbxEmailAliases.Items.Contains(ItemtoAdd, StringComparer.InvariantCultureIgnoreCase)
该方法接受 IEqualityComparer
、the docs。
正如 Steven Doggart 所指出的,ListBox 项需要使用 OfType(Of T):
lbxEmailAliases.Items.OfType(Of String).Contains(ItemtoAdd, StringComparer.InvariantCultureIgnoreCase)
如果这是一个标准的 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
另一种方法是 FindString
方法:
If lbxEmailAliases.FindString(ItemtoAdd) = ListBox.NoMatches Then
lbxEmailAliases.Items.Add(ItemtoAdd)
End If
注意:此方法搜索以指定字符串开头的项目,returns 第一个找到的项目的索引。
意味着它会找到 jdoe@domain.com
,即使现有的电子邮件地址是 jdoe@domain.computer.com
。
所以对于您的具体情况,这可能不是最佳解决方案。
编辑:
您可以改用FindStringExact
。像这样你会得到想要的不区分大小写的非部分比较。
If lbxEmailAliases.FindStringExact(ItemtoAdd) = ListBox.NoMatches Then
lbxEmailAliases.Items.Add(ItemtoAdd)
End If