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。