【C# 拡張メソッド】 foreach null listのチェック

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

よかったらシェアしてね!
目次
閉じる