2011-05-13 67 views
1

我有一个从数据库查询中填充的Customers类的ObservableCollection。由于表格是如何加入的,我有时会得到一次输入(Bill的邮寄地址不同于他的邮寄地址),两次出现在数据中。
每个客户行都有一个ID作为唯一的主键,当有人从绑定的ListView中选择一行时,这就是我用来提取更多客户信息的东西。 在这个程序的WinForms版本中,我会搜索ListView中的CustomerID,如果发现我会避免再次插入它。WPF ObservableCollection中的唯一条目

ObservableCollection似乎没有能力轻易告诉我一个CustomerID是否已经存在于一个集合的类实例中,所以我想知道处理这个问题的最好方法是什么。

的想法我到目前为止有:

' Not sure how to make this work, since the CustomerID and Name would be the same, but the city, state, zip might not be.' 
t = new classCustomer(CustomerID, CustomerName, City, State, Zip) 
if not sr.contains(t) then 
    sr.Add(t) 
end if 

Possibly figure out how to create an ObservableDictionary, but so far all the examples are in C#, and it may take me a while to port it over to VB.net

任何人都知道一个更好的实施?

+0

我会说这将更好地解决在查询本身,而不是在UI – jeroenh 2011-05-13 21:20:01

+0

我会同意你,但我不知道这是多么实际。对于高度规范化的数据库来说,这是一个真正复杂的查询,有10个左右的连接。我大概可以简化查询,但这会更好,并在更多领域有用。 – AndyD273 2011-05-15 23:19:24

回答

3

您只需告诉.NET什么定义了一个人,在这种情况下是ID。

只需重写equals你的客户对象上,那么您的收藏现在就能知道,如果2级的客户是相同的:

Public Class Person 

    Private id As Integer 

    Public Sub New(ByVal id As Integer) 
     Me.id = id 
    End Sub 

    Public Overrides Function Equals(ByVal obj As Object) As Boolean 

     Return (TypeOf (obj) Is Person) And (DirectCast(obj, Person)).id = Me.id 

    End Function 

    Public Overrides Function GetHashCode() As Integer 
     Return Me.id.GetHashCode() 
    End Function 

End Class 




Sub Main() 

     Dim observable As New ObservableCollection(Of Person)() 

     observable.Add(New Person(1)) 

     Dim duplicate As New Person(1) 

     If Not observable.Contains(duplicate) Then 
      observable.Add(duplicate) ' never gets hit because of .Equals override 
     End If 

    End Sub 

没有超越它不知道如何判断它们是等价的或不。

+0

很好的回答!完美解决问题。只是好奇,让我明白它是如何工作的,是Equals函数的GetHashCode部分,还是另一种比较方式?它只是返回id的哈希而不是整个类的哈希值,但对于Equals函数是否正常工作非常重要? – AndyD273 2011-05-16 12:55:03

+0

为了帮助其他人需要这个改变,Equals中的obj偶尔会有类型为“NamedObject”的类型,所以我在'If obj.GetType.Name =“Person”中添加了一些检查然后返回(TypeOf(obj)是Person)和(DirectCast(obj,Person))。id = Me.id否则返回False End If'。在附注中,我希望他们让你把换行符变成注释。 – AndyD273 2011-05-16 16:41:22