List型を使っていくといろいろと便利になってきました。
LINQ使っていると気づいている人もいると思いますが、SQLみたいな命令を使っているんですね。
SQLってなんやねんっっ!っていう人は、データベースを扱う命令だと思ってください🎵
今回は下記のことをしていきたいと思います。
◆要素を並び替える(降順/昇順/逆順)
◆ある条件のみを取得する
◆各要素に対して処理を行いたい
List型(リスト型)ってなに?
配列の1種ですね!
一言でいうと「登録型配列」かなぁ~!
いや「可長配列」でもいいかもしれません🎵
世の中もので例えるとバインダー的なw
定義の仕方は
A4サイズの紙(型、構造体、クラス)しか入れない、
バインダー(リスト型)を定義するって感じです。
要素を並び替える(昇順/降順/逆順)
まずは、相変わらずGUIを作っていきます。
ボタンを押したら、結果を表示していきます。
昇順
昇順に並び替えた場合、(小さいから大きい)に並べます。
今回使うのは、List型に用意されている関数Sort()とLINQのOrderBy()の2つを紹介します。
『並び替え【昇順】』のボタンを押したときの処理を作りました。
private void btnAscendingOrder_Click(object sender, EventArgs e) { txtResult.Text = ""; //初期化 //オリジナル(サンプル) List<int> lstSampleInt = new List<int>() { 2, 4, 7, 3 }; //サンプル定義 txtResult.Text += "----- <OrgList> -----" + "\r\n"; foreach (int i in lstSampleInt) { txtResult.Text += i.ToString() + "\r\n"; } //OrderBy List<int> lstOrderby = lstSampleInt.OrderBy(x => x).ToList(); txtResult.Text += "----- <Orderby> -----" + "\r\n"; foreach (int i in lstOrderby) { txtResult.Text += i.ToString() + "\r\n"; } //Sort(自身を並び替える) lstSampleInt.Sort(); txtResult.Text += "----- <Sort> -----" + "\r\n"; foreach (int i in lstSampleInt) { txtResult.Text += i.ToString() + "\r\n"; } }
LINQのOrderBy()を使ったとき、見慣れていない書き方ですね。これはラムダ式といいます。
※今はこんな書き方ができるんだと思ってください。
List型に用意されているSort()でも可能なので、好きな方を使いましょう。
注意することは、Sort()を使った場合は、並び替えるList型は、対象となるList型を直接並び替えます。
OrderBy()とは違い、並び替えた結果が出力されるのではなく、定義した変数自体を並び替えます。
結果も問題なさそうですね。
降順
降順に並び替えた場合、(大きいから小さい)に並べます。
List型に用意されている関数Sort()とLINQのOrderByDescending()の2つを紹介します。
『並び替え【降順】』のボタンを押したときの処理を作りました。
private void btnDescendingOrder_Click(object sender, EventArgs e) { txtResult.Text = ""; //初期化 //オリジナル(サンプル) List<int> lstSampleInt = new List<int>() { 2, 4, 7, 3 }; //サンプル定義 txtResult.Text += "----- <OrgList> -----" + "\r\n"; foreach (int i in lstSampleInt) { txtResult.Text += i.ToString() + "\r\n"; } //OrderByDescending List<int> lstOrderby = lstSampleInt.OrderByDescending(x => x).ToList(); txtResult.Text += "----- <OrderByDescending> -----" + "\r\n"; foreach (int i in lstOrderby) { txtResult.Text += i.ToString() + "\r\n"; } //Sort(自身を並び替える) lstSampleInt.Sort(); //昇順にする lstSampleInt.Reverse(); //逆順にする txtResult.Text += "----- <Sort+Reverse> -----" + "\r\n"; foreach (int i in lstSampleInt) { txtResult.Text += i.ToString() + "\r\n"; } }
結果は下記の通りになります。
ここでのポイントは『降順とは、昇順の逆順である』という事です。
その為、先ほどのSort()と事項のReverse()を組み合わせることで実現することができます。
逆順
逆順とは、現在の順番とは逆にすることです。[A-Z]の順番を[Z-A]に並び替えることになります。
降順の時にすでに使ってしまいましたが、この時はReverse()を使います。
※これはList型に準備されている関数なのでLINQは関係ありません
private void btnReverseOrder_Click(object sender, EventArgs e) { txtResult.Text = ""; //初期化 //オリジナル(サンプル) List<int> lstSampleInt = new List<int>() { 2, 4, 7, 3 }; //サンプル定義 txtResult.Text += "----- <OrgList> -----" + "\r\n"; foreach (int i in lstSampleInt) { txtResult.Text += i.ToString() + "\r\n"; } //Reverse(自身を並び替える) lstSampleInt.Reverse(); //逆順にする txtResult.Text += "----- <Reverse> -----" + "\r\n"; foreach (int i in lstSampleInt) { txtResult.Text += i.ToString() + "\r\n"; } }
結果は下記の通りです。逆順を使うことは滅多にないので、頭の片隅に入れておきましょう。
ある条件の要素を取得(抽出)する
『定義したリストの中に、ある条件に一致したものだけ取得したい』ってことはありませんか?
【数値のリストから奇数だけを抽出したい】とか【ある数値より大きい要素だけを取得したい】とか。。。意外とやりたいけど、ループで回すにはめんどくさいっっ❕❕って人はLINQを使いましょう🎵
まずはGUIから。
いつものように、やりたい処理をボタンにして、結果表示用のテキストボックスを準備します。
同じことをほぼ書くので、どちらかやりたい事に近い処理を見てください
リストの中から奇数を抽出
奇数の判断はどうするのか?
奇数の判断の方法は2で割った時に余りが1の時です。
LINQのWhere()を使っていきます。
private void btnWhereOdd_Click(object sender, EventArgs e) { txtResult.Text = ""; //初期化 //オリジナル(サンプル) List<int> lstSampleInt = new List<int>() { 2, 4, 7, 3 }; //サンプル定義 txtResult.Text += "----- <OrgList> -----" + "\r\n"; foreach (int i in lstSampleInt) { txtResult.Text += i.ToString() + "\r\n"; } //Where(奇数を抽出) List<int> lstWhere = lstSampleInt.Where(x => x % 2 == 1).ToList(); txtResult.Text += "----- <Where> -----" + "\r\n"; foreach (int i in lstWhere) { txtResult.Text += i.ToString() + "\r\n"; } }
結果は下記。
Where()の( )の中に条件を入れればOKです。ラムダ式で書かれていますが、慣れですw
Where(x => x % 2 == 1)で奇数を抽出することができました!
2より大きい数値を抽出(取得)する
先ほどと同じくLINQのWhere()を使っていきます。
private void btnWhereThan2_Click(object sender, EventArgs e) { txtResult.Text = ""; //初期化 //オリジナル(サンプル) List<int> lstSampleInt = new List<int>() { 2, 4, 7, 3 }; //サンプル定義 txtResult.Text += "----- <OrgList> -----" + "\r\n"; foreach (int i in lstSampleInt) { txtResult.Text += i.ToString() + "\r\n"; } //Where(奇数を抽出) List<int> lstWhere = lstSampleInt.Where(x => 2 < x).ToList(); txtResult.Text += "----- <Where> -----" + "\r\n"; foreach (int i in lstWhere) { txtResult.Text += i.ToString() + "\r\n"; } }
次は2より大きい数値だけを抽出しました。結果は。。。
Where()の中にラムダ式で条件を書いていくと、条件に一致した内容だけ抽出できます。
自力で書いてもいいですが、LINQやラムダ式をわかっている人からすると1行でわかるので読みやすくなりますね。
要素に対して処理を行う
【リストの要素すべてを2倍にしたい】って事ありませんか?
これはLINQのSelect()を使うと1行で処理することが来ます。
要素を2倍の数値にする。
ボタンを押すとリストの中の数値を2倍にしましょう!
private void btnSelectDouble_Click(object sender, EventArgs e) { txtResult.Text = ""; //初期化 //オリジナル(サンプル) List<int> lstSampleInt = new List<int>() { 2, 4, 7, 3 }; //サンプル定義 txtResult.Text += "----- <OrgList> -----" + "\r\n"; foreach (int i in lstSampleInt) { txtResult.Text += i.ToString() + "\r\n"; } //Select(2倍にする) List<int> lstSelect = lstSampleInt.Select(x => x * 2).ToList(); txtResult.Text += "----- <Select> -----" + "\r\n"; foreach (int i in lstSelect) { txtResult.Text += i.ToString() + "\r\n"; } }
結果は。。。
Select()の場合は( )の中に処理を書くようになります。
まとめ
リスト型を[並び替える方法]や[条件に一致した要素の抽出]や[要素に対して処理する方法]を紹介しました。LIINQやラムダ式といった内容が出てきて正直いやになりますよねw
実は自分もラムダ式で書かれているものを見るとイラッとしてしまいますw
コードをすっきりさせたい場合、ラムダ式で書くことになってくるので、理解していた方がいいと思います。
◆並び替え[Sort()/OrderBy(), OrderByDescending(), Reverse()]
◆条件一致[Where()]
◆要素に対しての処理[Select()]
補足[Sort()の中をラムダ式で昇順/降順]
実はSort()の( )の中をラムダ式で書くと、昇順と降順をすることができます。
★昇順 [List型].Sort((a, b) => a – b)
★降順 [List型].Sort((a, b) => b – a)
業務でプログラミング(C#/VB/Python)を作っている。
挫折を何回も繰り返し、幾度の壁を乗り越えてきた。
乗り越えてきた事を忘れないように記録に残す。
同じ思いをしている人への情報提供になれたらと思う。
基本は初心者に向けたプログラムの情報を提供する。
コメント