2

ソースがnullでない場合、次のステートメントは正常に機能します。

Filters.Selection
            .Select(o => new GetInputItem() { ItemID = o.ItemId })

「Filters.Selection」がnullの場合は爆撃します(明らかに)。ソースがnullの場合はnullを返す、またはソースがnullでない場合は「Select」関数を実行する独自の拡張メソッドを作成する方法はありますか。

たとえば、次のようなものです。

var s = Filters.Selection
                .MyOwnSelect(o => new GetInputItem() { ItemID = o.ItemId })

「Filters.Selection」がnullの場合、「s」はnullになります。そうでない場合、「s」には、LINQSelectを使用して評価された「func」が含まれます。

これは、LINQ拡張/カスタマイズについて詳しく知るためだけのものです。

ありがとう。

4

3 に答える 3

2

あなたはこれを行うことができます:

public static IEnumerable<U> SelectOrNull<T,U>(this IEnumerable<T> seq, Func<T,U> map)
{
    if (seq == null)
         return Enumerable.Empty<U>(); // Or return null, though this will play nicely with other operations
    return seq.Select(map);
}
于 2013-02-14T19:10:33.680 に答える
0

LINQ to Objectsについて話していると仮定すると、絶対に:

public static class NullSafeLinq
{
    public static IEnumerable<TResult> NullSafeSelect<TSource, TResult>
        (this IEnumerable<TSource> source, Func<TSource, TResult> selector)
    {
        // We don't intend to be safe against null projections...
        if (selector == null)
        {
            throw new ArgumentNullException("selector");
        }
        return source == null ? null : source.Select(selector);
    }
}

また、私のEdulinqブログ投稿シリーズを読んで、 LINQtoObjectsがどのように機能するかについて詳しく知ることもできます。

于 2013-02-14T19:10:07.943 に答える
0

はい、フレームワークのEnumerableクラスとQueryableクラスを見てください。これらは、標準のクエリ演算子を実装しています。

同じシグニチャに一致する同じSelect拡張メソッドを使用して同様のクラスを実装する必要があります。その後、ソースがnullである場合は、早期に終了し、空のシーケンスを返す必要があります。

于 2013-02-14T19:10:08.400 に答える