人気ブログランキング | 話題のタグを見る
(.Net)Array.Sort() で比較条件をオリジナルなものにする
配列でソートするって手動でやるとかなりめんどくさいですが、.Net には Sort() メソッドが追加されており、簡単にソートができるようです。
数値型や文字列型の基本クラスを使った配列には何もしなくても、Array.Sort(配列名) でソートできます。

ただ、並び替えのルールを自分で定義したい時もありますよね。

IComparer インターフェイスの Compare メソッドを実装したメソッドを作り、Array.Sort の引数に渡してやればいいそうです。

ということで、あるフォルダのファイル名を文字列として取得しソートするコード書いてみました。
このファイルには拡張子の前に2桁の数値があり、この数値の昇順でソートするという要件です。
(.Net)Array.Sort() で比較条件をオリジナルなものにする_e0091163_22131274.jpg


コードは下記のようになります。

Public Class Form1
 
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
'任意のフォルダのファイル名取得
Dim fileArray As String() = IO.Directory.GetFiles("c:\test")
'ソート前の配列出力
Console.WriteLine("ソート前")
For Each file As String In fileArray
Console.WriteLine(file)
Next
 
'ソートに使う比較クラスインスタンス生成
Dim fileNameComp As IComparer = New FileNameComp()
'ソート
Array.Sort(fileArray, fileNameComp)
'ソート後の配列出力
Console.WriteLine("ソート後")
For Each file As String In fileArray
Console.WriteLine(file)
Next
End Sub
 
''' <summary>
''' ソートの際比較するための IComparer を実装したクラス
''' </summary>
''' <remarks></remarks>
Public Class FileNameComp
Implements IComparer
 
''' <summary>
''' ソートの際比較に使う IComparer.Compare を実装したメソッド。
''' ファイル名の末尾2ケタの数値の大小で比較する。
''' </summary>
''' <param name="x">比較オブジェクト</param>
''' <param name="y">比較オブジェクト</param>
''' <returns>
''' 0より小さい値: x が y より小さい
''' 0 : x と y は等しい
''' 0より大きい値: x が y より大きい値 </returns>
Public Function Compare(ByVal x As Object, ByVal y As Object) As Integer Implements IComparer.Compare
Dim str1 As String = CType(x, String)
Dim str2 As String = CType(y, String)
str1 = str1.Substring(str1.Length - 6, 2)
str2 = str2.Substring(str2.Length - 6, 2)
Dim int1 As Integer
Dim int2 As Integer
If Not Integer.TryParse(str1, int1) Then
'xがキャストできないときはxのほうが大きいとする
Return 1
End If
If Not Integer.TryParse(str2, int2) Then
'yがキャストできないときはyのほうが大きいとする
Return -1
End If
 
Return int1 - int2
End Function
End Class
 
End Class


結果は下記の通りです。

ソート前
c:\test\aa_03.txt
c:\test\dd_11.txt
c:\test\Test_01.txt
c:\test\Test_02.txt
c:\test\Test_10.txt
c:\test\Test_99.txt
c:\test\んん_00.txt
ソート後
c:\test\んん_00.txt
c:\test\Test_01.txt
c:\test\Test_02.txt
c:\test\aa_03.txt
c:\test\Test_10.txt
c:\test\dd_11.txt
c:\test\Test_99.txt

ちゃんと指定された条件で、ソートされてますね。

参考:
@IT:配列を独自の順序でソート(並べ替え)するには?
MSDN:IComparer.Compare メソッド
by jehoshaphat | 2009-07-14 22:14 | .Net開発


<< HDDの故障かと思ったら、、、その1 (html)Vectorのある... >>