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アクセスデータベースからロードされ、各行のデータが辞書として保存されたリストです。

この場合、fromの要素にdataは、日本の町の名前とその読み取り値、および行IDなどの他の情報を含むフィールドがあります。

テキストボックス付きのフォームがあります。dataユーザーが何かを入力するときに、検索語に対応する町の名前を重複せずに取得したいと思います。

現在、結果には多数の重複が含まれています>個別の結果のみを取得するために、これを並べ替えるにはどうすればよいですか?

他のいくつかの投稿からキーが必要になる可能性があることを読みましたが、拡張メソッドを使用してこれを宣言するにはどうすればよいですか?

4

1 に答える 1

1

Distinctデフォルトの等値比較子を使用して値を比較します。

コレクションには文字列の配列が含まれているDistinctため、2 つの異なる配列が互いに等しくなることはないため、期待どおりに動作しません (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 に答える