質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

1回答

972閲覧

Sortメソッドの並び替え順序

退会済みユーザー

退会済みユーザー

総合スコア0

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2017/10/28 16:37

###前提・実現したいこと
Sortメソッドの引数に並び替え順序を定義したメソッドを表すComparison<T>デリゲートを指定すると、
その順序に従ってソートするらしいですが、
この並び替え順序を定義したメソッドが、どのように並び替えを定義しているのかわかりません。
具体的には、下記CompareDescending内において、
何故、return y - x だと降順になって、
何故、return x - y だと昇順になるのかがわかりません。

また、CompareDescending内でreturn x - yを返す時、x,yの出力をとると、
x:5, y:3
x:3, y:4
x:3, y:1
x:2, y:3
x:3, y:3
x:3, y:3
x:5, y:3
x:3, y:2
x:1, y:1
x:1, y:2
x:5, y:5
x:5, y:4
となる理由もわかりません。
同様に、return y - xを返す時のx,yの出力結果もわかりません。
x:5, y:3
x:2, y:3
x:3, y:4
x:3, y:3
x:3, y:1
x:3, y:3
x:1, y:3
(以下省略)

ご教授のほど宜しくお願い致します。

###該当のソースコード
class Sample {
// 二つのintを比較するためのメソッド
static int CompareDescending(int x, int y)
{
//降順の場合。
//return y - x;

//昇順の場合。 //return x - y;

}

static void Main()
{
// ソート対象のList<int>
List<int> list = new List<int>(new int[] {5, 2, 3, 1, 4});

// ソート list.Sort(CompareDescending); foreach (int val in list) { Console.Write("{0}, ", val); } Console.WriteLine();

}
}

###試したこと 実際、試して結果がその通りになるのは確認しましたが、 なぜ、そのようになるのかがわかりません。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

Comparison<T> デリゲート
こちらを見れば分かると思いますが、Comparison<T> デリゲートは2つの値を比較した結果を返すだけです。
ソートは値が小さいと判断された方を前に持ってくる動きをします。
ですので、CompareDescending(int x, int y)が負の値を返す場合はxが先になり、正の値を返す場合はyが先になります。
こういう動きなので、return y - x;return x - y;と返す値を変えることにより、昇順と降順が切り替わることになります。

投稿2017/10/28 17:01

YAmaGNZ

総合スコア10258

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2017/10/29 12:33

ご回答ありがとうございます。 ソートは値が小さいと判断された方を前に持ってくる動きをするのですね。 ちなみにご提示いただいリンクには、そのことが書かれてる場所はありますか? (見つかりませんでした。) これはマニュアルに書くまでもなく、通念なのでしょうか?(自分が無知だったようです。) このソートの特性を踏まえると、 「戻り値が0より小さい値:xはyより小さい値。 戻り値が0より大きい値:xがyより大きい値。(yはxより小さい値)」 が、下記のように書き直せて、 「戻り値が0より小さい値:xはyより先に来る。 戻り値が0より大きい値:yはxより先に来る。」 ・return x-y; の場合。 戻り値が0より小さい値:xはyより先に来る。 →x-yが0より小さい値:xはyより先に来る。 → xはyより小さい値で、xはyより先にくる。 → 昇順 戻り値が0より大きい値:yはxより先に来る。 →x-yが0より大きい値:yはxより先に来る。 → yはxより小さい値で、yはxより先に来る。 → 昇順 ・return y-x; の場合。 戻り値が0より小さい値:xはyより先に来る。 → y-xが0より小さい値:xはyより先に来る。 → xはyより大きい値で、xはyより先に来る。 → 降順 戻り値が0より大きい値:yはxより先に来る → y-xが0より大きい値:yはxより先に来る。 → yはxより大きい値で、yはxより先に来る。 → 降順 というふうに解釈できるということでしょうか?
YAmaGNZ

2017/10/29 16:02

そのような解釈でよいかと思います。 SortメソッドはIComparableやIComparer、Comparison<T>といった比較用のメソッドを利用してソートされます。 そして、Sortメソッドで特にComparison<T>等を指定しない場合、デフォルトの比較が行われることになります。 このデフォルトの比較は普通に大小比較で昇順に並ぶ形になります。 Comparison<T>等を指定した場合、作成者の意図する並び替えを行うことが可能になります。 このメソッドは値1と値2を比較して、値1を先にしたい場合は負の値を、等しい場合は0を値2を先にしたい場合は正の値を返すように作成します。 ですので、 昇順の場合、 x<yの時は負の値 x=yの時は0 x>yの時は正の値 を返すように作ることになります。 これを数式で書いた場合、x-yとなります。 降順の場合はこの逆になりますので、y-xとなります。
退会済みユーザー

退会済みユーザー

2017/10/30 00:11

ご回答ありがとうございます。 理解できました。 ありがとうございます。
ozwk

2017/10/30 01:22

> ちなみにご提示いただいリンクには、そのことが書かれてる場所はありますか? この部分ですね > 戻り値 > Type: System.Int32 > > x と y の相対値を示す符号付き整数。次の表を参照してください。
退会済みユーザー

退会済みユーザー

2017/10/30 10:47

ご回答ありがとうございます。 なるほど、「相対値」が順序を意味していたのですね。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問