2

来自 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从访问数据库加载,并且是一个列表,其中每一行的数据存储为字典。

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

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

现在结果包含大量重复>我怎样才能得到这个排序只得到不同的结果?

我从其他一些帖子中读到可能需要一个密钥,但是如何使用扩展方法声明它?

4

1 回答 1

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())
于 2012-12-07T08:53:51.013 回答