vb.NET选择distinct ...如何使用它?

时间:2012-12-07 07:07:41

标签: vb.net linq

来自C#背景我对我无法使这个简单的linq查询工作感到有点恼火:

Dim data As List(Of Dictionary(Of String, Object))
Dim dbm As AccessDBManager = GlobalObjectManager.DBManagers("SecondaryAccessDBManager")

data = dbm.Select("*", "T町丁目位置_各務原")

Dim towns As IEnumerable(Of String()) 
        towns = data.Select(Function(d) New String() {d("町名_Trim").ToString(), d("ふりがな").ToString()})
        towns = towns.Where(Function(s) s(0).StartsWith(searchTerms) Or s(1).StartsWith(searchTerms)).Distinct()

Call UpdateTownsListView(towns.ToList())

我将相关位粘贴在一起,所以希望这里没有错误...

data从访问数据库加载,是一个列表,其中每行的数据都存储为字典。

在这种情况下,来自data的元素有一个字段,其中包含日本城镇的名称及其读数以及其他一些内容,例如行ID等。

我有一个带有文本框的表单。当用户输入内容时,我想从data检索与搜索词相对应的城镇名称而不重复。

现在结果包含重复的加载>如何才能将其排序为仅获得不同的结果?

我从其他一些帖子中读到可能需要一个密钥,但我怎么能用扩展方法声明这个呢?

1 个答案:

答案 0 :(得分:1)

Distinct使用默认的相等比较器来比较值。

您的集合包含字符串数组,因此Distinct将无法按预期方式工作,因为两个不同的数组永远不会相互相等(因为最后会使用ReferenceEquals)。


解决方案是使用Distinct重载IEqualityComparer

Class TwoStringArrayEqualityComparer 
    Implements IEqualityComparer(Of String())

    Public Function Equals(s1 As String(), s2 As String()) As Boolean Implements IEqualityComparer(Of String()).Equals
        ' Note that checking for Nothing is missing
        Return s1(0).Equals(s2(0)) AndAlso s1(1).Equals(s2(1))
    End Function

    Public Function GetHashCode(s As String()) As Integer Implements IEqualityComparer(Of String()).GetHashCode
        Return (s(0) + s(1)).GetHashCode() ' probably not perfect :-)
    End Function

End Class

...

towns = towns.Where(...).Distinct(new TwoStringArrayEqualityComparer())