2012-01-07 99 views
1

我有询问顾客的详细信息的对话框,将它们保存为一个列表检查,看是否名已在列表

Private fNames As List(Of String) 

我有检查,看看是否该名称的方法在列表中返回true,如果不是则返回false。

Public Function isNameInList(ByVal myName As String) As Boolean 
    Return fNames.Contains(myName) 
End Function 

如果返回值为false,则添加名称。

Public Sub addName(ByVal myName As String) 
     If isNameInList(myName) = False Then 
      fNames.Add(myName) 
     End If 
End Sub 

该名称被添加到列表中,并进一步显示在列表框中。我去添加相同的名字,当它不应该时,它又被添加到列表框中。我错过了什么吗?

+0

“相同”的名字都在同一个案例中吗?在VB.Net中,“Bob”和“bob”不相等。我没有看到你在这里有什么问题。你能告诉我们你的代码调用addName吗? – Aaron 2012-01-07 17:38:39

+0

'我错过了什么'标点符号。 – 2012-01-07 18:03:09

+0

感谢您的有用评论。注意到并永远不会让它再次发生! – user445714 2012-01-07 18:07:38

回答

3

而不是使用List您可能想要使用Set,如HashSet

Sets顾名思义,不允许重复,并且在使用中与Lists非常相似。如果一个集合已经包含一个值,则Add将返回false,并且该值将不会被添加。如果仍然添加,则这些值不完全相同(由EqualsGetHashCode方法定义)。


注:Equals弦乐的情况和空白敏感,所以你可能需要Trim字符串并将其转换为一个情况或比较时,使用StringComparer.OrdinalIgnoreCase

myString.Trim().Equals(myOtherString.Trim(), StringComparer.OrdinalIgnoreCase) 

如果你想做更多的工作,你甚至可以写自己的StringComparer

+1

是的,“家庭作业”问题的问题在于他可能被告知要使用列表。不幸的是,教授并不总是保持他们的课程最新的最好的方法。 – Aaron 2012-01-07 17:55:59

1

该比较区分大小写。这意味着“乔”和“乔”是不同的,都将被添加。这可能是你的问题吗?

我测试了你的代码。它似乎工作。但是你也在谈论一个列表框。你在那里做错了什么?


如果声明您的列表作为System.ComponentModel.BindingList(Of String)而不是List(Of String),然后分配这个名单列表框这样的:

ListBox1.DataSource = fNames 

然后当你将它们添加新的名称将自动显示在列表框中去fames。

+0

我已经使用了标记和标记两次 – user445714 2012-01-07 17:39:29