【C#】リスト型とラムダ式(Sort)

スポンサーリンク

List型(Listクラス)を使いこなそう第7弾です。
今回紹介するのは「Sortメソッド」です。

Sortメソッド

Sortメソッドでは、リスト内の要素の順番を昇順/降順に整列します。
前回同様に数字のリストを作ってみます。
数字のリストから、昇順に並べる】をSortメソッドを使って実施してみたいと思います。

Sortメソッドを知らない、ラムダ式を分からない人の場合

Googleで検索していつも見つけるのですが、まじめに処理を考えるなら。。。

List<int> lstSample = new List<int> { 8, 16, 1, 2, 4 };
List<int> lstSort = new List<int>();
for (int idx = 0; idx < lstSample.Count; idx++)
{
    //最小値を取得し、追加
    int n = lstSample.Min();
    lstSort.Add(n);

    //元のリストから取得した最小値を削除
    lstSample.Remove(n);
    idx--;
}
lstSort.ForEach(i => Console.WriteLine(i));   //結果:1,2,4,8,16 

かなり力業のような気がしますが。。。
最小値を取得して別のリストに登録するを繰り返すでしょう。。。

Sortメソッドを使い、ラムダ式ができる人の場合

これをSortメソッドを使って、ラムダ式が出来る人は。。。

List<int> lstSample = new List<int> { 8, 16, 1, 2, 4 };
lstSample.Sort((a, b) => a - b);
lstSample.ForEach(i => Console.WriteLine(i));   //結果:1,2,4,8,16

標準メソッドを使うと本当に楽ですね。処理を考えなくてもいいですし。。。
インプットとアウトプットさえ分かっていれば、1行でソートする事が可能ですね。

解説

(リスト型).Sort()のSort部分にマウスを持っていくと、説明がでてきます。

引数には、Comparison<int>が必要だと書いています。
< 戻り値[ なし ] & 引数[ Comparison<int型> ]の関数>が必要だと書いています。
[Comparison]は2つのオブジェクトを比較するメソッドです。

ラムダ式の書き方については、下記記事を参考にしてください。
【C#】ラムダ式の使い方(書き方) | 育児パパの人生備忘録 (t19488sns.com)

今回の場合は、ラムダ式で書く場合、《 左辺:引数 => 右辺:式 》という事から、こうなります。

■昇順の場合
  左辺(引数):int型の名前 a,b ※名前なので任意
  右辺(式) :aはbより小さい値(0より小さい)

■降順の場合
  左辺(引数):int型の名前 a,b ※名前なので任意
  右辺(式) :aはbより大きい値(0より大きい)

補足(降順の時のラムダ式の書き方)

List<int> lstSample = new List<int> { 8, 16, 1, 2, 4 };
lstSample.Sort((a, b) => b - a);
lstSample.ForEach(i => Console.WriteLine(i));   //結果:16,8,4,2,1

補足(リストの中が構造体の時)

下記構造体があったとします。

struct Sample
{
    internal int i;
    internal double d;
    internal string str;
}

サンプルの構造体のリストを作成し、Sort()を使って、構造体のint型の要素でソートします。

//サンプルの構造体を作成する
List<Sample> lstSample = new List<Sample>();
lstSample.Add(new Sample { i = 8, d = 4,str = "な" });
lstSample.Add(new Sample { i = 16, d = 8 ,str = "か"});
lstSample.Add(new Sample { i = 1, d = 16,str = "あ" });
lstSample.Add(new Sample { i = 2, d = 2 ,str = "さ"});
lstSample.Add(new Sample { i = 4, d = 1,str = "た" });

//構造体のint型を比較して、昇順に並べ替える
lstSample.Sort((a, b) => a.i - b.i);
lstSample.ForEach(smpl => 
    Console.WriteLine("i:" + smpl.i + " / d:" + smpl.d + " / str:" + smpl.str));

//結果
//i: 1 / d:16 / str:あ
//i: 2 / d: 2 / str:さ
//i: 4 / d: 1 / str:た
//i: 8 / d: 4 / str:な
//i:16 / d: 8 / str:か

すこし解説すると、今回定義した(a,b)はa,bともに構造体Sampleになります。
その為、右辺の式を入れる時は、構造体のSample内のint型を指定します。

実験で文字でソートが出来るか確認しましたが、エラーになりました。
Comparisonの条件式はint型にならないといけません。
もし行うのであれば、文字をChar型として扱えば、可能になります。

コメント

タイトルとURLをコピーしました