3流プログラマのメモ書き

元開発職→社内SE→派遣で営業支援→開発戻り浦島太郎状態の三流プログラマのIT技術メモ書き。 このメモが忘れっぽい自分とググってきた技術者の役に立ってくれれば幸いです。

(.Net)List<T>.Sortの使い方

Listに Sort という便利そうなメソッドがあります。

で、例えば User クラスというオリジナルクラスの List を、Userクラス内のプロパティ値に基づいてソートしたいって時もあります。

これは、List.Sort メソッドでデリゲートを作成してやればいいようです。

例えば、List.Sort(delegate( x, y){});という場合、デリゲートのメソッドの戻り値が正なら x は y よりも後に、負なら y は x より手前にきます。

下記のように文字列で数値も含む場合長さも考慮した場合の例だと下記のようなコードになります。(C#)

List UserList = new List();

//UserList.Addを使って、Userオブジェクトをリストに追加。。。

UserList.Add(new User("900"));

UserList.Add(new User("1000"));

UserList.Add(new User("2000"));

UserList.Add(new User("abc"));

UserList.Add(new User("zz"));

UserList.Sort(delegate(User x, User y)

{

if (x.dmSamAccountName == null && y.dmSamAccountName != null) return -1;

if (x.dmSamAccountName != null && y.dmSamAccountName == null) return 1;

 

int ix,iy;

//数値の場合は桁数が長い方を大きいとみなす。

if (int.TryParse(x.dmSamAccountName, out ix) && int.TryParse(y.dmSamAccountName, out iy) )

{

return ix - iy;

}

return String.Compare(x.dmSamAccountName, y.dmSamAccountName);

});

 

//カスタムクラス(.Net3.5以降仕様)

public class User

{

public ActiveDirectory(string usrid){

ID = usrid;

}

public string ID{get;set;}

}

ソート後の並び順は下記のようになります。

900

1000

2000

abc

zz

自分で並び替えを実装しないといけないのが不便ですが、自由に並び替えのルールが決めれるのはいいですね。