【C#】【VB.NET】要素が含まれているかAny()したらArgumentNullExceptionが発生する

f:id:ktts:20190418202442p:plain

インスタンス生成していないならエラーが起きるのも当然ちゃ当然でしょうが、
生成されているか判断する必要がある場合もあるでしょう。
if ((list != null) && (list.Any()))とかすればいいんでしょうけど、
String.IsNullOrEmptyみたいな便利なモノはないかと調べてみました。

参考サイト
stackoverflow.com

使用例

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();

        List<string> list = null;
        if (list.AnyOrDefault())
        {
            Console.WriteLine("The List has any item.");
        }
        else
        {
            Console.WriteLine("The List does not has any item.");
        }
    }
}

/// <summary>
/// 拡張メソッドを定義する静的クラス
/// </summary>
public static class Extentions
{
    /// <summary>
    /// null参照エラーではfalseを返す拡張Anyメソッド
    /// </summary>
    /// <typeparam name="T">Type</typeparam>
    /// <param name="source">Source</param>
    /// <returns></returns>
    public static bool AnyOrDefault<T>(this IEnumerable<T> source)
    {
        return (source?.Any() ?? false);
    }
}

エラーを発生させないで結果を得ることができました。
f:id:ktts:20190418210120p:plain

ちな、VB.NETの場合はnull合体演算子(??)がないので(たぶん)、そのまま使うことができません。

使用例(VB.NET

Public Class Form1
    Sub New()

        ' この呼び出しはデザイナーで必要です。
        InitializeComponent()

        ' InitializeComponent() 呼び出しの後で初期化を追加します。

        Dim list As List(Of String) = Nothing
        If list.AnyOrDefault() Then
            Console.WriteLine("The List has any item.")
        Else
            Console.WriteLine("The List does not has any item.")
        End If
    End Sub
End Class

Module Extentions
    <System.Runtime.CompilerServices.Extension()>
    Public Function AnyOrDefault(Of type)(source As IEnumerable(Of type)) As Boolean
        Return If(source?.Any() Is Nothing, False, source.Any())
    End Function
End Module