C# リファクタリング foreachで抽出
List
public void Hoge() { var list = new List<String>(); list.Add("123"); list.Add("1234"); list.Add("12345"); list.Add("123456"); // 4文字以下のものをリストから抽出したい。 var list2 = new List<string>(); foreach(var str in list) { if (str.Length <= 4) list2.Add(str); } }
foreachをなるべく書かないようにする。
public void Hoge() { var list = new List<String>(); list.Add("123"); list.Add("1234"); list.Add("12345"); list.Add("123456"); // 4文字以下のものをリストから抽出したい。 var list2 = new List<string>(); list2 = list.FindAll(x => x.Length <= 4); }
さらに行数を減らすなら
public void Hoge() { var list = new List<String>(); list.Add("123"); list.Add("1234"); list.Add("12345"); list.Add("123456"); // 4文字以下のものをリストから抽出したい。 var list2 = new List<string>(list.FindAll(x => x.Length <= 4)); }
コンストラクタでそのまま渡してしまう。
だた括弧がネストしすぎると読みにくいし、デバッグ時にステップ実行しにくいという問題もある。
個人的にはステップ実行で動作確認するくらいならテストコード書けば良いと思いますが。
FindAllメソッドをRemoveメソッドに変えた場合
public void Hoge() { var list = new List<String>(); list.Add("123"); list.Add("1234"); list.Add("12345"); list.Add("123456"); // 4文字以下のものをリストから抽出したい。 list.RemoveAll(x => x.Length >= 5); }
FindAllメソッドとの違いとしては
・FindAllメソッドは戻り値がList
・RemoveAllメソッドは実行したコレクション自体を編集し、戻り値がint