- PR -

Listのソートの方法が理解できません

投稿者投稿内容
R・田中一郎
ぬし
会議室デビュー日: 2005/11/03
投稿数: 979
投稿日時: 2006-05-16 02:11
引用:

まどかさんの書き込み (2006-05-15 22:57) より:

よくListViewやTreeViewを使っているのでちょくちょく実装しています。
ListViewでのマルチカラムソートやTreeViewでのフォルダ群→ファイル群(それぞれでText順)など。
TreeNode.Tagにフォルダかファイルかを持ち、フォルダ<ファイルならReturn -1、逆ならReturn 1。
フォルダ同士、ファイル同士ならReturn NodeX.Text.CompareTo(NodeY.Text)
そんな具合です。



ソートはいろいろと利用するシーンが多いので、sort メソッドの使い方については、
きちんと覚えておく必要があるだろうとは思っていたのですが、思ったより簡単で多
様性もあってホッとしてます

前メインで開発していた VB6 の頃は、必要に応じてSortメソッドを実装させるのに
内部で自作した ShelSort 関数を共通で使いまわしてたりしました。
バイナリサーチも自作してたんですが、今は最初からメソッドとして実装されてい
るんですね。便利になりました〜
R・田中一郎
ぬし
会議室デビュー日: 2005/11/03
投稿数: 979
投稿日時: 2006-05-16 02:16
引用:

yaさんの書き込み (2006-05-15 23:03) より:

コード:

public void IndexSort() {
	this.Sort(delegate(DataItem a, DataItem b) { return b.Index - a.Index; });
}



でいいじゃんとも思うけども。



ここで質問する前に調べていたら、どこかでデリゲートで処理するみたいなことが書
いてあった訳ですが、こういうことだったんですね。

#今ひとつデリゲートが理解できていない .net 初心者は、上記に関して調べたくて
#ウズウズしているが、もう寝る時間・・・zzz
ya
大ベテラン
会議室デビュー日: 2002/05/03
投稿数: 212
投稿日時: 2006-05-16 07:44
というかもっと言うならIndexSortなんてメソッド作るななんですけどもね。Genericに行こうよ。

delegateはそんなに難しく考える必要もない。

コード:

Comparison<int> comparison = new Comparison<int>(Method);
comparison(0, 0);



これが理解できるならパラメータにdelegateインスタンスを渡すことが出来ることもわかるはず。
といってもさっきのコードは色々省略しているから、省略せずに書けば、

コード:

void IndexSort() {
	Comparison<DataItem> comparison = new Comparison<DataItem>(AnonimousMethod);
	this.Sort(comparison);
}

int AnonimousMethod(DataItem a, DataItem b) {
	return b.Index - a.Index;
}



になる。匿名delegateはパラメータの型で推論してくれるので省略しているだけで、実際はComparison<T> delegate型インスタンスを作ってパラメータに渡しているだけ。それを使って並び替えるメソッドがSort。

ちなみに、3.0ならさらに短く

コード:

void IndexSort() {
	this.Sort((x, y) => y.Index - x.Index);
}




でおkな予定(俗にいうλ式。ちょっと前に新しいやつが出たので変わってるかも)。

# 後で気づいたけどy.Index - x.Indexはoverflowする可能性あるので
# もとのままCompareTo使ってくださいすいません
R・田中一郎
ぬし
会議室デビュー日: 2005/11/03
投稿数: 979
投稿日時: 2006-05-16 09:38
引用:

yaさんの書き込み (2006-05-16 07:44) より:

というかもっと言うならIndexSortなんてメソッド作るななんですけどもね。Genericに行こうよ。



そうですね。前記の書き方ができれば、その場で簡単に実行できますもんね。

引用:

yaさんの書き込み (2006-05-16 07:44) より:

delegateはそんなに難しく考える必要もない。



既に何度か使ってはいるんですが、イベントちっくな使い方しか経験がなくて、今回
のようにデリゲートの参照を渡すというのは初めてで目から鱗でした。

とは書いていますが、こんなに丁寧にご説明いただいたのに、まだ理解できていませ

しかし、コードのサンプルも書いていただきましたので、実際の動きを確認しながら、
検証して行きたいと思います。

本当に感謝です( ̄人 ̄)オガンデミル...
かるあ
ぬし
会議室デビュー日: 2003/11/16
投稿数: 1190
お住まい・勤務地: センガワ→ムサシノ
投稿日時: 2006-05-16 09:53
僕も勉強になりました。

そうか、匿名デリゲートってこう使うのか
まだ2003から抜け出せません…

スキルアップ/キャリアアップ(JOB@IT)