C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[2]: .net framework 4.0と4.5のSortの違い


(過去ログ 122 を表示中)

[トピック内 3 記事 (1 - 3 表示)]  << 0 >>

■73000 / inTopicNo.1)  .net framework 4.0と4.5のSortの違い
  
□投稿者/ pod (13回)-(2014/08/09(Sat) 11:15:24)

分類:[C#] 

2014/08/09(Sat) 11:15:56 編集(投稿者)
度々の質問失礼します。

.net framework 4.5で作ったC#のプログラムの対象フレームワークを4.0に切り替えたら、
CompareTo()を使ったソート結果に違いがでてしまいました。

具体的にはList内のオブジェクトにzIndexという数値をもたせ、数値の小さいものから順に
ソートするというもので、同値の場合はリストに追加した順番のままになるつもりでした。

ソート対象となるクラスはこちらです。

    class SortTest : IComparable
    {
        public int zIndex = 0;
        public string name = "";

        public SortTest(string name)
        {
            this.name = name;
        }

        public int CompareTo(object obj)
        {
            int x = this.zIndex - ((SortTest)obj).zIndex;
            if (x < 0)
            {
                return -1;
            }
            else if (x == 0)
            {
                return 0;
            }
            else
            {
                return 1;
            }
        }
    }

実験に使ったメインクラスは次のようになっています。

	SortTest sample1 = new SortTest("sample1");
	SortTest sample2 = new SortTest("sample2");
	SortTest sample3 = new SortTest("sample3");
	SortTest sample4 = new SortTest("sample4");

	sample1.zIndex = 0;
	sample2.zIndex = 0;
	sample3.zIndex = 0;
	sample4.zIndex = 0;

	var sampleList = new List<SortTest>();
	sampleList.Add(sample1);
	sampleList.Add(sample2);
	sampleList.Add(sample3);
	sampleList.Add(sample4);

	sampleList.Sort();

	foreach (SortTest test in sampleList)
	{
	    Console.WriteLine(test.name);
	}

バージョン4.5の結果は
sample1
sample2
sample3
sample4
と並びました。zIndexは全て同値なのでリストに追加した順番そのままです。(正常)

バージョン4.0の結果は
sample3
sample4
sample1
sample2
になってしまいます。

ちなみに同値ではなく

sample1.zIndex = 1;
sample2.zIndex = 2;
sample3.zIndex = 3;
sample4.zIndex = 4;

と割り当てた場合はどちらのバージョンでも正しい順番になりました。
バージョンに関係なく狙った動作をさせるにはどう改善したらいいのでしょうか?
よろしくお願いします。

引用返信 編集キー/
■73001 / inTopicNo.2)  Re[1]: .net framework 4.0と4.5のSortの違い
□投稿者/ Hongliang (220回)-(2014/08/09(Sat) 11:28:55)
List<T>.Sort() (.NET 4)
http://msdn.microsoft.com/ja-jp/library/b0zbh7b6(v=vs.100).aspx
List<T>.Sort() (.NET 4.5)
http://msdn.microsoft.com/ja-jp/library/b0zbh7b6(v=vs.110).aspx
.NET 4.5で要素数が少ない場合のアルゴリズムが変更になったみたいですね。
// それにしても訳が破綻しているなぁ。
なんにせよ、List<T>.Sort()は安定ソートと見なすことはできません。

標準ライブラリで安定ソートというと、Enumerable.OrderBy拡張メソッドがありますね。
これは非破壊的(自分自身を並び替えるのではなく、新しいIEnumerableを返す)ですが……。
引用返信 編集キー/
■73002 / inTopicNo.3)  Re[2]: .net framework 4.0と4.5のSortの違い
□投稿者/ pod (14回)-(2014/08/09(Sat) 12:43:48)
No73001 (Hongliang さん) に返信
> .NET 4.5で要素数が少ない場合のアルゴリズムが変更になったみたいですね。
> // それにしても訳が破綻しているなぁ。
> なんにせよ、List<T>.Sort()は安定ソートと見なすことはできません。
>
> 標準ライブラリで安定ソートというと、Enumerable.OrderBy拡張メソッドがありますね。
> これは非破壊的(自分自身を並び替えるのではなく、新しいIEnumerableを返す)ですが……。

回答ありがとうございます。
このようなケースでSort()を使うべきではなかったのですね。
OrderBy()とToList()を使う形に書きなおして正常に動作しました。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -