foreachは、nullチェックをしないと
’System.NullReferenceException’の例外が発生するんですよね・・・。
そこで、拡張メソッドを使って簡単回避する方法をご紹介します。
目次
【C# 拡張メソッド】 foreach null listのチェック
例外が発生するソースコード例
public class Program
{
public void Main()
{
List<string> list = null;
Console.WriteLine("①前");
foreach (var item in list)
{
Console.WriteLine("②ループ内");
}
Console.WriteLine("③後");
}
}
// 【実行結果】
// ①前
// 例外がスローされました: 'System.NullReferenceException'
nullを回避をしてないので、’System.NullReferenceException’が発生してしまいます。
拡張メソッド
public static class IEnumerableExtension
{
public static IEnumerable<T> OrEmptyIfNull<T>(this IEnumerable<T> collection)
{
return collection ?? Enumerable.Empty<T>();
}
}
他にも便利な拡張メソッドを知りたい方は「【C#】拡張メソッド まとめ」のページをどうぞ。
使い方①
public class Program
{
public void Main()
{
List<string> list = null;
Console.WriteLine("①前");
foreach (var item in list.OrEmptyIfNull())
{
Console.WriteLine("②ループ内");
}
Console.WriteLine("③後");
}
}
// 【実行結果】
// ①前
// ③後
nullを回避をしたので、例外の発生なく処理が終了しました。
使い方②
Where句を使って条件を絞る場合にもOrEmptyIfNull()を使用することで例外発生を回避できます。
public class Member
{
public int Code { get; set; }
public string Name { get; set; }
}
public class Program
{
public void Main()
{
// リストがnullの場合
List<Member> membersNull = GetNullList();
Console.WriteLine("〇〇 リストがnull 〇〇");
Console.WriteLine("==== Before ====");
foreach (var item in membersNull.OrEmptyIfNull().Where(a => a.Code == 1))
{
Console.WriteLine($"==== Loop ==== Code:'{item.Code}' Name:'{item.Name}'");
}
Console.WriteLine("==== After ====");
// リストがnull以外の場合
List<Member> members = GetList();
Console.WriteLine("〇〇 リストがnull以外 〇〇");
Console.WriteLine("==== Before ====");
foreach (var item in members.OrEmptyIfNull().Where(a => a.Code == 1))
{
Console.WriteLine($"==== Loop ==== Code:'{item.Code}' Name:'{item.Name}'");
}
Console.WriteLine("==== After ====");;
}
private List<Member> GetNullList()
{
return null;
}
private List<Member> GetList()
{
var list = new List<Member>();
list.Add(new Member { Code = 1, Name = "Sato" });
list.Add(new Member { Code = 1, Name = "Ishii" });
list.Add(new Member { Code = 2, Name = "Toda" });
return list;
}
}
// 【実行結果】
// 〇〇 リストがnull 〇〇
// ==== Before ====
// ==== After ====
// 〇〇 リストがnull以外 〇〇
// ==== Before ====
// ==== Loop ==== Code:'1' Name:'Sato'
// ==== Loop ==== Code:'1' Name:'Ishii'
// ==== After ====
最後まで読んでくれてありがとうございます。
それでは、また。
こちらの記事も読まれています!
参考サイト
【C#】foreach null チェック demicadeのブログ
stackoverflow.com:Check for null in foreach loop