vb.net--使用arraylist作为字典中的键
您创建了一个新的vb.net--使用arraylist作为字典中的键,vb.net,Vb.net,您创建了一个新的ArrayList,但没有将其添加到词典中。你为什么期望它能在字典里找到 您需要将新的ArrayList添加到字典中,然后才能在其中找到它 有两个不同的ArrayList对象具有相同的内容。但是,它们仍然是不同的对象,一个在字典中,另一个不在字典中。您创建了一个新的ArrayList,但没有将其添加到字典中。你为什么期望它能在字典里找到 您需要将新的ArrayList添加到字典中,然后才能在其中找到它 有两个不同的ArrayList对象具有相同的内容。但是,它们仍然是不同的对象,
ArrayList
,但没有将其添加到词典中。你为什么期望它能在字典里找到
您需要将新的ArrayList
添加到字典中,然后才能在其中找到它
有两个不同的
ArrayList
对象具有相同的内容。但是,它们仍然是不同的对象,一个在字典中,另一个不在字典中。您创建了一个新的ArrayList
,但没有将其添加到字典中。你为什么期望它能在字典里找到
您需要将新的ArrayList
添加到字典中,然后才能在其中找到它
有两个不同的
ArrayList
对象具有相同的内容。但是,它们仍然是不同的对象,一个在字典中,另一个不在字典中。这是因为它执行引用比较,而您希望它进行值比较
这两个arrayList在内容上是相同的,但它并不指向同一个实例&因此,它失败了
编辑:另外,当字典中没有这个(
al
)时,为什么您希望它被找到?这是因为它执行引用比较,而您希望它是值比较
这两个arrayList在内容上是相同的,但它并不指向同一个实例&因此,它失败了
编辑:另外,当字典中不存在此(
al
)时,为什么希望找到它?要使字典正常工作,键必须相等,如果它们具有相同的值。字典使用ArrayList.Equals()方法比较数组列表。该方法不做您需要它做的事情,它只在数组列表是相同对象时返回True
您需要使用字典构造函数来传递比较器。让它看起来像这样:
Dim dct As New Dictionary(Of ArrayList, ArrayList)
' Populate Dictionary
dct.Add(New ArrayList({"Dot", "0"}), New ArrayList({20, 30, 40,> 50}))
dct.Add(New ArrayList({"Dot", "1"}), New ArrayList({120, 130, 140,> 150}))
' Search in dictionary
Dim al As New ArrayList({"Dot", "2"})
If dct.ContainsKey(al) Then ' does not work****
MessageBox.Show("Found: " & al(0).ToString)
End If
其中MyComparer类是一个实现IEqualityComparer(ArrayList的)的比较器。一种可能的实现方式可以是:
Dim dct As New Dictionary(Of ArrayList, ArrayList)(new MyComparer())
Class MyComparer
实现(ArrayList的)IEqualityComparer
作为布尔值的公共函数Equals1(ByVal x作为System.Collections.ArrayList,ByVal y作为System.Collections.ArrayList)实现System.Collections.Generic.IEqualityComparer(属于System.Collections.ArrayList)。等于
如果x.Count y.Count,则返回False
对于ix,整数=0到x。计数-1
如果不是x(ix).等于(y(ix)),则返回False
下一个
返回真值
端函数
作为整数的公共函数GetHashCode1(ByVal obj作为System.Collections.ArrayList)实现System.Collections.Generic.IEqualityComparer(属于System.Collections.ArrayList)。GetHashCode
返回obj.Count.GetHashCode
端函数
末级
要使字典正常工作,键必须相等(如果它们具有相同的值)。字典使用ArrayList.Equals()方法比较数组列表。该方法不做您需要它做的事情,它只在数组列表是相同对象时返回True
您需要使用字典构造函数来传递比较器。让它看起来像这样:
Dim dct As New Dictionary(Of ArrayList, ArrayList)
' Populate Dictionary
dct.Add(New ArrayList({"Dot", "0"}), New ArrayList({20, 30, 40,> 50}))
dct.Add(New ArrayList({"Dot", "1"}), New ArrayList({120, 130, 140,> 150}))
' Search in dictionary
Dim al As New ArrayList({"Dot", "2"})
If dct.ContainsKey(al) Then ' does not work****
MessageBox.Show("Found: " & al(0).ToString)
End If
其中MyComparer类是一个实现IEqualityComparer(ArrayList的)的比较器。一种可能的实现方式可以是:
Dim dct As New Dictionary(Of ArrayList, ArrayList)(new MyComparer())
Class MyComparer
实现(ArrayList的)IEqualityComparer
作为布尔值的公共函数Equals1(ByVal x作为System.Collections.ArrayList,ByVal y作为System.Collections.ArrayList)实现System.Collections.Generic.IEqualityComparer(属于System.Collections.ArrayList)。等于
如果x.Count y.Count,则返回False
对于ix,整数=0到x。计数-1
如果不是x(ix).等于(y(ix)),则返回False
下一个
返回真值
端函数
作为整数的公共函数GetHashCode1(ByVal obj作为System.Collections.ArrayList)实现System.Collections.Generic.IEqualityComparer(属于System.Collections.ArrayList)。GetHashCode
返回obj.Count.GetHashCode
端函数
末级
我同意这种方法。不过,这些方法应该处理空参数,如果equals实际上是同一个对象,并且ReferenceEquals返回true,那么equals就会短路。GetHashCode可以更好地使用类似于string类实现中使用的方法。GetHashCode必须便宜,很难使用ArrayList。我同意这种方法。不过,这些方法应该处理空参数,如果equals实际上是同一个对象,并且ReferenceEquals返回true,那么equals就会短路。GetHashCode可以更好地使用类似于string类实现中使用的方法。GetHashCode必须便宜,很难使用ArrayList。