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型として扱えば、可能になります。
業務でプログラミング(C#/VB/Python)を作っている。
挫折を何回も繰り返し、幾度の壁を乗り越えてきた。
乗り越えてきた事を忘れないように記録に残す。
同じ思いをしている人への情報提供になれたらと思う。
基本は初心者に向けたプログラムの情報を提供する。
コメント