6

次のような2つのクラスがあります。

class Widget
{
    string Selected { get; set; }

    List<Option> Options { get; set; }
}

class Option
{
    string InternalCode { get; set; }

    string ExternalCode { get; set; }
}

OptionsExternalCodeオプションとして表示するために、クライアントごとに異なるデータが動的に取り込まれます

Selectedが取り込まれExternalCodeます。

次に、 which に一致するものにアクセスする必要がありますInternalCode

現在、私はこれをやっています:

var option = widget.Options.SingleOrDefault(o => o.ExternalCode == widget.Selected);

var internalCode = option == null ? string.Empty : option.InternalCode;

Null Coalesce を使用して単一の行を使用することは可能ですか?

4

4 に答える 4

15

はい、C# 6 を使用できる場合は、ニーズに合った null 伝播と null 合体演算子を使用できます。

var option = widget.Options
             .SingleOrDefault(o => o.ExternalCode == widget.Selected)?.InternalCode
             ?? string.Empty;

部品の?.使用に変換されますoption == null ?

于 2016-01-06T10:37:06.797 に答える
9

確かに、小さな変更を加えて:

var option = widget.Options
                   .Where(o => o.ExternalCode == widget.Selected)
                   .Select(o => o.InternalCode)
                   .FirstOrDefault() ?? "";

つまり、一連の一致するオプションを一連の内部コードに射影し、それらの最初の を取得します。デフォルトはnull... です。これにより、結果に対して null 合体演算子を使用できます。

代わりにパトリックの回答に従ってnull条件演算子を使用できますが、個人的にはこの回答のコードを好みます-理解しやすいと思います。

于 2016-01-06T10:38:04.777 に答える
2

拡張メソッドを書いた場合、これを行うことができます:

public static class MonadExtensions
{
    public static TResult With<TSource, TResult>(TSource source, Func<TSource, TResult> action) where TSource : class
        {
            if (source != default(TSource))
                return action(source);
            return default(TResult);
        }
}

そしてそれを使用します:

var internalCode  = widget.Options.SingleOrDefault(o => o.ExternalCode == widget.Selected).With(o=>o.InternalCode)??"";
于 2016-01-06T10:37:43.630 に答える