NOBlog 〜バカの一念〜

基本的にはNOB(ノブ)の日記。
スキークロス国際レース出場を目標に日々努力中。

  November/2007  
S M T W T F S
        1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30  
blog内検索

[VB.NET応用]独自のソート順序でソートするには

2005-01-19
数値や文字列の配列の要素をソートするには、ArrayクラスのSortメソッドを利用することができますが、独自に定義したオブジェクトをソートしたい場合には、どうしたら良いのでしょうか。
それを実現するためには、次のようにIComparerインターフェースを利用すると良いです。
例えば、ある文字列を保持するプロパティ(ManagedString)を持つクラス(StringManager)があるとします。
このStringManagerのManagedStringプロパティに保持された文字列の長さが短い順にソートしたい場合は次のようにします。

IComparer.Compareメソッドは、次のようなルールに基づき実装します。
・x < y のとき、負の値を返す。
・x = y のとき、0を返す。
・x > y のとき、正の値を返す。

このルールに基づいて、独自の実装を行ったのがManagedStringComparerです。

Public Class ManagedStringComparer
  Implements IComparer

  Public Function Compare(ByVal x As Object, ByVal y As Object) As Integer
    Implements ICompare.Compare

    Dim strx As StringManager = DirectCast(x, StringManager)
    Dim stry As StringManager = DirectCast(y, StringManager)

    '保持している文字列の文字列長が短い方を小とします。(ソートしたとき先に並ぶ)
    Return strx.ManagedString.Length - stry.ManagedString.Length

  End Function
End Class

あとは、ArrayクラスのSortメソッドにStringManagerクラスとManagedStringComparerクラスを渡すだけです。

Dim strmng As StringManager() = { _
  New StringManager("abc"), _
  New StringManager("d"), _
  New StringManager("efgh") _
}

Dim mngdstrcomp As IComparer = New ManagedStringComparer()

Array.Sort(strmng, mngdstrcomp)

ソート後のstrmngの内容を出力すると次のようになっています。

d
abc
efgh


※注
当ブログのTipsは、@IT等の情報サイトの内容を参考にして構成された記事
もあります。Tipsの内容に著作権等権利を侵害する内容があった場合には、
告知して下さい。早急に訂正または削除にて対応したいと思います。

この記事へのトラックバックURL

この記事へのコメント
Copyright(C) PwBlog. All rights reserved.