C#でプログラミングをする際、自作クラスのリストを作成し、そのリストの中身を検索する処理を書くことがあると思います。このような処理は、foreachループでリストの内容を順番に探索する処理でじで実現できますが、実はもっと簡単な書き方があります。
本記事では、自作クラスのリストを検索する便利なメソッドを紹介します。
やりたいこと
以下のような自作クラスがあるとします。
class Member
{
public int ID;
public string Name;
// コンストラクタ
public Member(int id, string name)
{
ID = id;
Name = name;
}
}
上記クラスのインスタンスを保持するリストの中から名前が一致する要素を検索します。
List<Member> MemberList = new List<Member>();
void Sample()
{
// リストの内容を作成
MemberList.Add(new Member(1, "Sato"));
MemberList.Add(new Member(2, "Tanaka"));
MemberList.Add(new Member(3, "Suzuki"));
// 探したい名前
string name = "Tanaka";
// 名前で検索
Member member = FindMemberByName( name ); // ★これを実現したい
// 検索結果を表示
if (member != null)
{
System.Diagnostics.Debug.Print($"{member.Name} : ID={member.ID}");
}
else
{
System.Diagnostics.Debug.Print($"{name}は見つかりませんでした。");
}
}
サンプル
foreachを使用
まずは基本の形。要素を先頭から順番にチェックして名前が一致する要素があったら、その要素を返します。
Member FindMemberByName(string name)
{
foreach (var member in MemberList)
{
if (member.Name == name) return member;
}
return null;
}
機能としては上記で十分ですが、もっと簡単な書き方があります。
Find()を使用
List<T>にはFind()メソッドがあります。この中に下記のようにラムダ式を記述することで上記foreachと同等の処理を記述できます。要素が見つからない場合にnullが返る点も同等です。
Member FindMemberByName2(string name)
{
return MemberList.Find(member => member.Name == name);
}
FirstOrDefault()を使用
他にもList<T>にはFirstOrDefault()メソッドでも同じ様に記述できます。
Member FindMemberByName3(string name)
{
return MemberList.FirstOrDefault(member => member.Name == name);
}
次の記事では条件に一致する要素が複数ある場合について書きます。
まとめ
本記事では、自作クラスのリストを検索する便利なメソッドを紹介しました。