来自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
检索与搜索词相对应的城镇名称而不重复。
现在结果包含重复的加载>如何才能将其排序为仅获得不同的结果?
我从其他一些帖子中读到可能需要一个密钥,但我怎么能用扩展方法声明这个呢?
答案 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())