ゆるふわで雑な日記

Microsoft系の技術情報を中心にゆるふわに綴っていく予定です

IEnumerable<T>がnullまたはの要素の数が0個の場合を判定して処理を分岐したいときの話

どうしてますか?
って単純な疑問を提示するだけのエントリー

例えば、こんなやつ(Any()の結果を反転するパターン)

void Hoge<T>(IEnumetable<T> foo)
{
    // fooがnullまたは空の時
    if(!(foo?.Any() ?? false))
        Initialize();

    DoSometing();
} 

!とか出来たら使いたくない

例えば、こんなやつ2(Allするパターン)

void Hoge<T>(IEnumetable<T> foo)
{
    // fooがnullまたは空の時
    if(foo?.All(_ => false) ?? true)
        Initialize();

    DoSometing();
}

空集合に対するAllが必ずtrueなことを知らないと戸惑う + 直感的じゃない

例えば、こんなやつ3(数えたらいいじゃん)

void Hoge<T>(IEnumetable<T> foo)
{
    // fooがnullまたは空の時
    if((foo?.Count() ?? 0) == 0) return;
        Initialize();

    DoSometing();
}

…無限のIEnumerableの時やばいね?

例えば、こんなやつ4(else使おうよ)

void Hoge<T>(IEnumetable<T> foo)
{
    // fooがnullまたは空の時
    if(foo?.Any() ?? false) 
    {
        DoSometing();
    }
    else
    {
        Initialize();
        DoSometing();
    }

}

…DoSometing();2回書いてる

例えば、こんなやつ4(else使おうよ2)

void Hoge<T>(IEnumetable<T> foo)
{
    // fooがnullまたは空の時
    if(foo?.Any() ?? false) 
    {
    }
    else
    {
        Initialize();
        DoSometing();
    }

}

…ifで実行されるの空じゃん

例えば、こんなやつ4(それっぽいメソッド作る)

sstatic class Extensions
{
    internal static bool IsNullOrEmpty<T>(this IEnumerable<T> target)
                                       =>  foo?.All(_ => false) ?? true;
}
void Hoge<T>(IEnumetable<T> foo)
{
    // fooがnullまたは空の時
    if(foo.IsNullOrEmpty()) 
        Initialize();

    DoSometing();
}

空集合に対するAllが必ずtrueなことを知らないと戸惑うけど名前付いた

他にもあるかもですが、どれが好きですか?
個人的には(たくさん書くなら)最後のやつかな