5

elvis 演算子、別名 null 条件演算子は非常にクールです。

LINQ クエリでは、null 合体 "??" と連携してうまく機能します。オペレーター。

Somedata.Where(dt=>(dt?.Inner?.InnerMost?.Include=="Yes")??false);

しかし、中間値をキャストする必要がある場合はどうすればよいでしょうか?

チェーンの 1 つのリンクについては、問題なく動作します。

Somedata.Where(dt=>(
     ((InnerClass)dt?.Inner)
     ?.InnerMost)?.Include=="Yes")
     ??false);

ただし、必要なキャストを追加すると、キャストと呼び出しが「離れて」しまいます。

Somedata.Where(dt=>(
     ((InnerMostClass)            <=== Cast
     ((InnerClass)dt?.Inner)
     ?.InnerMost)?.Include=="Yes"))         <=== Use
     ??false);

おそらくここで括弧を何度も台無しにしましたが、理解していただければ幸いです。

この「列車事故」呼び出しチェーンはコードの匂いがしますが、簡潔さと明確さを改善するためにこれを行うより表現力豊かな方法はありますか?

4

1 に答える 1

1

非常に単純な拡張メソッドを使用して、チェーンを維持し、括弧を防ぐことができます。

dt?.Inner.As<InnerClass>()?.InnerMost.As<InnerMostClass>()?.Include == "Yes"

次のように定義された拡張メソッドを使用します。

public static class ObjectExtensions
{
    public static T As<T>(this object obj) where T : class
    {
        return obj as T;
    }
}
于 2016-03-13T20:07:06.197 に答える