(:3[kanのメモ帳]

個人ゲーム開発者kan.kikuchiのメモ的技術ブログ。月木更新でUnity関連がメイン。

(:3[kanのメモ帳]



引数でデリゲート(≒ラムダ式)を受け取れるList<T>のメソッド【C#】


このエントリーをはてなブックマークに追加


はじめに

今回はタイトル通り、引数でデリゲート(≒ラムダ式)を受け取れるListのメソッドの紹介です!

ようは「Listにはこんな便利なメソッドがあるよ〜」みたいな話です。


ちなみに、「実戦で役立つ C#プログラミングのイディオム/定石&パターン」

に同様の項目(本の方はラムダ式のイメージを掴むことが目的)があったのが記事を書いたきっかけです。


実戦で役立つ C#プログラミングのイディオム/定石&パターン

実戦で役立つ C#プログラミングのイディオム/定石&パターン


ただし、本に載っていなかったメソッドもいくつかありますし、

C#のバージョンによっては他にもあるかもしれません。


なお、そもそもデリゲートやラムダ式が分からんという方は以下の記事を参照の事。





目次


//処理対象のリスト
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 で降順になる感じです。