- PR -

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

投稿者投稿内容
R・田中一郎
ぬし
会議室デビュー日: 2005/11/03
投稿数: 979
投稿日時: 2006-05-15 14:20
ソートの方法が理解できません。

コード:

public class DataItem {
    // 本当はプロパティですが・・・
    public int Index;
    public string Code;
    public int Quantity;
}

public class DataList : List<DataItem> {
    /// <summary> DataItem.Index の小さい順に並び替える</summary>
    public void IndexSort() {
        ここに何を書いて良いのか・・・
    }
}



DataList の IndexSort() メソッドで、DataItem.Index の値の小さい順に List
を並べ替えたいのです。
List には Sort メソッドがありますが、これを使って上記を実現するやり方がわか
りません。
どのようにすれば良いのでしょうか?
かるあ
ぬし
会議室デビュー日: 2003/11/16
投稿数: 1190
お住まい・勤務地: センガワ→ムサシノ
投稿日時: 2006-05-15 14:26
IComparer を実装する DataItem の比較クラスのインスタンスを引数に与えます
http://www.melma.com/backnumber_120830/
まどか
ぬし
会議室デビュー日: 2005/09/06
投稿数: 372
お住まい・勤務地: ますのすし管区
投稿日時: 2006-05-15 14:28
引用:

List には Sort メソッドがありますが、これを使って上記を実現するやり方がわか
りません。


以前回答するために作ったサンプルです。
http://f57.aaa.livedoor.jp/~jeanne/bbs/faq.cgi?mode=al2&namber=3133
#あなたの師匠の掲示板です。3144の添付ファイル。

ArrayListですがほとんど一緒でしょう。
これがわかればListViewやTreeViewを思うように並べ替えできるようになります。

ヘルプの「ListView.ListViewItemSorter プロパティ」のサンプルがわかりやすいです。

[ メッセージ編集済み 編集者: まどか 編集日時 2006-05-15 14:33 ]
R・田中一郎
ぬし
会議室デビュー日: 2005/11/03
投稿数: 979
投稿日時: 2006-05-15 18:32
かるあさん、まどかさんありがとうございます。

リンク先を参照させていただき、分かったつもりになりながら、何とか書くことが
できました。
生意気にジェネリックってみました。

これで並び替えも思うがままです(^▽^)>まどかさん

コード:


public class DataItem {
// 本当はプロパティですが・・・
public int Index;
public string Code;
public int Quantity;
}

public class DataList : List<DataItem> {
public class DataItemCompareByIndex : IComparer<DataItem>
{
public int Compare(DataItem x, DataItem y) {
return x.Index.CompareTo(x.Index);
}
}

/// <summary> DataItem.Index の小さい順に並び替える</summary>
public void IndexSort() {
this.Sort(new DataItemCompareByIndex());
}
}



ちなみに以下の部分のパラメーター名ですが、サンプルを真似て x, y を使ってます
が、実際は何という名前にするのが良いのですか?

コード:

public int Compare(DataItem x, DataItem y) {
return x.Index.CompareTo(x.Index);
}



source, destination とか?
currentKey, CompareKey ?

#compare のパラメーターの型が間違ってたので修正・・・


[ メッセージ編集済み 編集者: R・田中一郎 編集日時 2006-05-15 19:23 ]
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-05-15 19:17
引用:

R・田中一郎さんの書き込み (2006-05-15 18:32) より:

source, destination とか?
currentKey, CompareKey ?


元と先の関係はないので、少なくとも source, destination ではないでしょう。
既存の NCL と同じく itemA, itemB のような名前で良いと思います。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
R・田中一郎
ぬし
会議室デビュー日: 2005/11/03
投稿数: 979
投稿日時: 2006-05-15 19:21
引用:

じゃんぬねっとさんの書き込み (2006-05-15 19:17) より:

引用:

R・田中一郎さんの書き込み (2006-05-15 18:32) より:

source, destination とか?
currentKey, CompareKey ?


元と先の関係はないので、少なくとも source, destination ではないでしょう。



そうなんですよね。
やはり、itemA, itemB が良さそうですね。
まどか
ぬし
会議室デビュー日: 2005/09/06
投稿数: 372
お住まい・勤務地: ますのすし管区
投稿日時: 2006-05-15 22:57
よくListViewやTreeViewを使っているのでちょくちょく実装しています。
ListViewでのマルチカラムソートやTreeViewでのフォルダ群→ファイル群(それぞれでText順)など。
TreeNode.Tagにフォルダかファイルかを持ち、フォルダ<ファイルならReturn -1、逆ならReturn 1。
フォルダ同士、ファイル同士ならReturn NodeX.Text.CompareTo(NodeY.Text)
そんな具合です。
ya
大ベテラン
会議室デビュー日: 2002/05/03
投稿数: 212
投稿日時: 2006-05-15 23:03
コード:

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



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

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