はじめに
今回はタイトル通り、引数でデリゲート(≒ラムダ式)を受け取れるList
ようは「Listにはこんな便利なメソッドがあるよ〜」みたいな話です。
ちなみに、「実戦で役立つ C#プログラミングのイディオム/定石&パターン」
に同様の項目(本の方はラムダ式のイメージを掴むことが目的)があったのが記事を書いたきっかけです。
実戦で役立つ C#プログラミングのイディオム/定石&パターン
- 作者: 出井秀行
- 出版社/メーカー: 技術評論社
- 発売日: 2017/02/18
- メディア: 大型本
- この商品を含むブログ (1件) を見る
ただし、本に載っていなかったメソッドもいくつかありますし、
C#のバージョンによっては他にもあるかもしれません。
なお、そもそもデリゲートやラムダ式が分からんという方は以下の記事を参照の事。
目次
- はじめに
- 目次
- Exists : 条件に一致する要素が1つでもあるか
- TrueForAll : 全ての要素が条件に一致するか
- Find : 条件と一致する最初の要素を取得
- FindLast : 条件と一致する最後の要素を取得
- FindIndex : 条件と一致する最初の要素のインデックスを取得
- FindLastIndex : 条件と一致する最後の要素のインデックスを取得
- FindAll : 条件と一致する全ての要素を取得
- RemoveAll : 条件と一致する全ての要素を削除
- ForEach : 全ての要素に処理を実行
- CovertAll : 全ての要素を変換
- Sort : 要素を並び替える
//処理対象のリスト var list = new List<string> { "a", "aa", "aaa", "aaaa", "b", "bb", "bbb", "bbbb", "c", "cc", "ccc", "cccc" }; //4文字以上の文字列はあるか var exists4Length = list.Exists(s => s.Length >= 4); //4文字以上の文字列があるのでTrue //全て4文字以上の文字列か var is4LengthForAll = list.TrueForAll(s => s.Length >= 4); //4文字未満の文字列もあるのでFalse //3文字の最初の文字列を取得 var first3LengthText = list.Find(s => s.Length == 3); //aaaを取得 //3文字の最後の文字列を取得 var last3LengthText = list.FindLast(s => s.Length == 3); //cccを取得 //2文字の文字列が入ってる最初のインデックスを取得 var fist2LengthIndex = list.FindIndex(s => s.Length == 2); //aaなので、1を取得 //2文字の文字列が入ってる最後のインデックスを取得 var last2LengthIndex = list.FindLastIndex(s => s.Length == 2); //ccなので、9を取得 //2文字の文字列を全て取得 List<string> twoLengthTextList = list.FindAll(s => s.Length == 2); //aaとbbとccが入ったListを取得 //文字列の長さで昇順に並び替える list.Sort((a, b) => a.Length - b.Length); //a, b, c, aa, …という感じに //2文字以上の文字列を削除(listの中身はaとbとcだけになる) int removedNum = list.RemoveAll(s => s.Length >= 2); //削除した要素の個数、9を取得 //全ての要素をログで表示 list.ForEach(s => Debug.Log(s)); //全て大文字にする(元のlistの中身は変わらない) var uppperTextList = list.ConvertAll(s => s.ToUpper()); //a → Aなど、全て大文字に
Exists : 条件に一致する要素が1つでもあるか
ExistsはListの中に条件に一致する要素が1つでもあるかを判定するメソッドです。
//処理対象のリスト var list = new List<string> { "a", "aa", "aaa", "aaaa", "b", "bb", "bbb", "bbbb", "c", "cc", "ccc", "cccc" }; //4文字以上の文字列はあるか var exists4Length = list.Exists(s => s.Length >= 4); //4文字以上の文字列があるのでTrue
TrueForAll : 全ての要素が条件に一致するか
TrueForAllはListの中の全要素が条件に一致するかを判定するメソッドです。
//処理対象のリスト var list = new List<string> { "a", "aa", "aaa", "aaaa", "b", "bb", "bbb", "bbbb", "c", "cc", "ccc", "cccc" }; //全て4文字以上の文字列か var is4LengthForAll = list.TrueForAll(s => s.Length >= 4); //4文字未満の文字列もあるのでFalse
Find : 条件と一致する最初の要素を取得
Findは条件と一致する最初の要素を取得するメソッドです。
ちなみに条件と一致する要素がなければnullを取得します。
//処理対象のリスト var list = new List<string> { "a", "aa", "aaa", "aaaa", "b", "bb", "bbb", "bbbb", "c", "cc", "ccc", "cccc" }; //3文字以上の最初の文字列を取得 var first3LengthText = list.Find(s => s.Length == 3); //aaaを取得
FindLast : 条件と一致する最後の要素を取得
FindLastは条件と一致する最後の要素を取得するメソッドです。
ちなみに条件と一致する要素がなければnullを取得します。
//処理対象のリスト var list = new List<string> { "a", "aa", "aaa", "aaaa", "b", "bb", "bbb", "bbbb", "c", "cc", "ccc", "cccc" }; //3文字以上の最後の文字列を取得 var last3LengthText = list.FindLast(s => s.Length == 3); //cccを取得
FindIndex : 条件と一致する最初の要素のインデックスを取得
FindIndexは条件と一致する最初の要素のインデックスを取得するメソッドです。
ちなみに条件と一致する要素がなければ-1を取得します。
//処理対象のリスト var list = new List<string> { "a", "aa", "aaa", "aaaa", "b", "bb", "bbb", "bbbb", "c", "cc", "ccc", "cccc" }; //2文字の文字列が入ってる最初のインデックスを取得 var fist2LengthIndex = list.FindIndex(s => s.Length == 2); //aaなので、1を取得
なお、検索を開始する最初のインデックスを指定するstartIndexと、
//2文字の文字列が入ってる最初のインデックスを取得(ただしインデックスが2、つまりaaaから) var fist2LengthIndex = list.FindIndex(startIndex : 2, s => s.Length == 2); //bなので、5を取得
検索する要素の個数を指定するcountという引数もあります。
//2文字の文字列が入ってる最初のインデックスを取得(ただし、検索する要素は1つ) var fist2LengthIndex = list.FindIndex(startIndex:0, count : 1, s => s.Length == 2); //aしか検索せず、2文字の文字列はないので、-1を取得
FindLastIndex : 条件と一致する最後の要素のインデックスを取得
FindLastIndexは条件と一致する最後の要素のインデックスを取得するメソッドです。
ちなみに条件と一致する要素がなければ-1を取得します。
//処理対象のリスト var list = new List<string> { "a", "aa", "aaa", "aaaa", "b", "bb", "bbb", "bbbb", "c", "cc", "ccc", "cccc" }; //2文字の文字列が入ってる最後のインデックスを取得 var last2LengthIndex = list.FindLastIndex(s => s.Length == 2); //ccなので、9を取得
なお、FindIndexと同様に引数startIndexとcountが使えます。
FindAll : 条件と一致する全ての要素を取得
FindAllは条件と一致する全ての要素を取得するメソッドです。
ちなみに条件と一致する要素がなければ空のListを取得します。
//処理対象のリスト var list = new List<string> { "a", "aa", "aaa", "aaaa", "b", "bb", "bbb", "bbbb", "c", "cc", "ccc", "cccc" }; //2文字の文字列を全て取得 List<string> twoLengthTextList = list.FindAll(s => s.Length == 2); //aaとbbとccが入ったListを取得
なお、FindAllIndexもありそうですが、ありません。
RemoveAll : 条件と一致する全ての要素を削除
RemoveAllは条件と一致する全ての要素を削除するメソッドです。
ちなみに戻り値は削除した要素の数です。
//処理対象のリスト var list = new List<string> { "a", "aa", "aaa", "aaaa", "b", "bb", "bbb", "bbbb", "c", "cc", "ccc", "cccc" }; //2文字以上の文字列を削除(listの中身はaとbとcだけになる) int removedNum = list.RemoveAll(s => s.Length >= 2); //削除した要素の個数、9を取得
ForEach : 全ての要素に処理を実行
ForEachは全ての要素に処理を実行するメソッドです。
//処理対象のリスト var list = new List<string> { "a", "aa", "aaa", "aaaa", "b", "bb", "bbb", "bbbb", "c", "cc", "ccc", "cccc" }; //全ての要素をログで表示 list.ForEach(s => Debug.Log(s));
CovertAll : 全ての要素を変換
CovertAllは全ての要素を変換するメソッドです。
//処理対象のリスト var list = new List<string> { "a", "aa", "aaa", "aaaa", "b", "bb", "bbb", "bbbb", "c", "cc", "ccc", "cccc" }; //全て大文字にする(元のlistの中身は変わらない) var uppperTextList = list.ConvertAll(s => s.ToUpper()); //a → Aなど、全て大文字に
Sort : 要素を並び替える
Sortは要素を並び替えるメソッドです。
//処理対象のリスト var list = new List<string> { "a", "aa", "aaa", "aaaa", "b", "bb", "bbb", "bbbb", "c", "cc", "ccc", "cccc" }; //文字列の長さで昇順に並び替える list.Sort((a, b) => a.Length - b.Length); //a, b, c, aa, …という感じに
なおデリゲートの引数は比較する2つの要素、返り値はintで、返り値を比較して並び替えます。
具体的にはa - b で昇順、b - a で降順になる感じです。