web-dev-qa-db-ja.com

?空の文字列の合体?

私が気づくのは、空文字列(_""_またはnullなど)と条件演算子をチェックすることです。

現在の例:

_s.SiteNumber.IsNullOrEmpty() ? "No Number" : s.SiteNumber;
_

これは単なる拡張メソッドであり、次と同等です。

_string.IsNullOrEmpty(s.SiteNumber) ? "No Number" : s.SiteNumber;
_

空ではなく、nullではないため、_??_はトリックを行いません。 _??_のstring.IsNullOrEmpty()バージョンが完璧なソリューションです。私はこれをもっときれいにする方法が必要だと思っています(私は願っています!)が、私はそれを見つけるのに途方に暮れています。

.Net 4.0のみにある場合でも、これを行うためのより良い方法を誰もが知っていますか?

151
Nick Craver

これを行う組み込みの方法はありません。ただし、拡張メソッドが文字列またはnullを返すようにすることで、合体演算子が機能するようになります。しかし、これは奇妙なことであり、私は個人的にあなたの現在のアプローチを好みます。

すでに拡張メソッドを使用しているので、値またはデフォルトを返すメソッドを作成しないでください。

string result = s.SiteNumber.ConvertNullOrEmptyTo("No Number");
69
Reed Copsey

C#では、既にnullの値を??に置き換えることができます。必要なのは、空の文字列をnullに変換する拡張機能だけで、次のように使用します。

s.SiteNumber.NullIfEmpty() ?? "No Number";
117
RedFilter

私はこれが古い質問であることを知っています-しかし、私は答えを探していましたが、上記のどれも私のニーズと私が最終的に使用したものに適合しませんでした:

private static string Coalesce(params string[] strings)
{
    return strings.FirstOrDefault(s => !string.IsNullOrEmpty(s));
}

使用法:

string result = Coalesce(s.SiteNumber, s.AltSiteNumber, "No Number");

編集:この関数を記述するよりコンパクトな方法は次のとおりです。

static string Coalesce(params string[] strings) => strings.FirstOrDefault(s => !string.IsNullOrEmpty(s));
38
sfsr

私が使用したいユーティリティ拡張機能がいくつかあります。

public static string OrDefault(this string str, string @default = default(string))
{
    return string.IsNullOrEmpty(str) ? @default : str;
}

public static object OrDefault(this string str, object @default)
{
    return string.IsNullOrEmpty(str) ? @default : str;
}

編集:sfsrの答えに触発され、今後このツールボックスにこのバリアントを追加します。

public static string Coalesce(this string str, params string[] strings)
{
    return (new[] {str})
        .Concat(strings)
        .FirstOrDefault(s => !string.IsNullOrEmpty(s));
}
15
Justin Morgan

おそらく以前に提案されたよりも少し速い拡張方法:

public static string Fallback(this string @this, string @default = "")
{
    return (@this == null || @this.Trim().Length == 0) ? @default : @this;
}
6
Chilidog

ヌル合体演算子の利点の1つは、短絡することです。最初の部分がnullでない場合、2番目の部分は評価されません。これは、フォールバックに高価な操作が必要な場合に役立ちます。

私は結局:

public static string Coalesce(this string s, Func<string> func)
{
    return String.IsNullOrEmpty(s) ? func() : s;
}

使用法:

string navigationTitle = model?.NavigationTitle.
    Coalesce(() => RemoteTitleLookup(model?.ID)). // Expensive!
    Coalesce(() => model?.DisplayName);
6
wensveen

文字列が空の場合は常にnullを返すNullIfEmpty拡張メソッドを使用して、?? (Null Coalescing Operator)は通常どおり使用されます。

public static string NullIfEmpty(this string s)
{
    return s.IsNullOrEmpty() ? null : s;
}

これにより、??通常どおり使用し、チェーンを読みやすくします。

string string1 = string2.NullIfEmpty() ?? string3.NullIfEmpty() ?? string4;
4
jjr2000

文字列拡張メソッドValueOrDefault()はどうですか

public static string ValueOrDefault(this string s, string sDefault)
{
    if (string.IsNullOrEmpty(s))
        return sDefault;
    return s;
}

または、文字列が空の場合はnullを返します。

public static string Value(this string s)
{
    if (string.IsNullOrEmpty(s))
        return null;
    return s;
}

しかし、これらのソリューションを試してはいませんでした。

3
devio

私は独自の文字列Coalesce拡張メソッドを使用しています。ここではLINQを使用しており、時間のかかる操作のためにリソースを絶対に浪費しているため(タイトループで使用しています)、私は共有します。

public static class StringCoalesceExtension
{
    public static string Coalesce(this string s1, string s2)
    {
        return string.IsNullOrWhiteSpace(s1) ? s2 : s1;
    }
}

私はそれは非常に簡単だと思います、そしてあなたはヌル文字列値を気にする必要さえありません。次のように使用します。

string s1 = null;
string s2 = "";
string s3 = "loudenvier";
string s = s1.Coalesce(s2.Coalesce(s3));
Assert.AreEqual("loudenvier", s);

よく使います。あなたが最初にそれを使用した後になくては生きられないそれらの「ユーティリティ」機能の1つ:-)

3
Loudenvier

私はこのための次の拡張メソッドQQQの簡潔さが好きですが、もちろん演算子は好きですか?のほうがいい。しかし、2つだけでなく3つの文字列オプション値を比較できるようにすることで、これを1つ増やすことができます。

#region QQ

[DebuggerStepThrough]
public static string QQQ(this string str, string value2)
{
    return (str != null && str.Length > 0)
        ? str
        : value2;
}

[DebuggerStepThrough]
public static string QQQ(this string str, string value2, string value3)
{
    return (str != null && str.Length > 0)
        ? str
        : (value2 != null && value2.Length > 0)
            ? value2
            : value3;
}


// Following is only two QQ, just checks null, but allows more than 1 string unlike ?? can do:

[DebuggerStepThrough]
public static string QQ(this string str, string value2, string value3)
{
    return (str != null)
        ? str
        : (value2 != null)
            ? value2
            : value3;
}

#endregion
0