سؤال

شيء أجد نفسي أفعل أكثر وأكثر هو التحقق من سلسلة فارغة (كما في "" أو null) ومشغل شرطي.

مثال حالي:

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

هذه مجرد طريقة تمديد، إنها تعادل:

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

لأنه فارغ وليس لاغيا، ?? لن تفعل الخدعة. أ string.IsNullOrEmpty() نسخة من ?? سيكون الحل الأمثل. أعتقد أنه يجب أن يكون هناك طريقة نظافة للقيام بذلك (آمل!)، لكنني كنت في خسارة للعثور عليه.

هل يعرف أحد بأفضل طريقة للقيام بذلك، حتى لو كان ذلك فقط في .NET 4.0؟

هل كانت مفيدة؟

المحلول

لا توجد طريقة مدمجة للقيام بذلك. يمكنك إجراء طريقة التمديد الخاصة بك بإرجاع سلسلة أو فارغة، ومع ذلك، من شأنها أن تسمح لمشغل التنافس بالعمل. هذا سيكون غريبا، ومع ذلك، أنا شخصيا أفضل منهجك الحالي.

نظرا لأنك تستخدم أيضا طريقة تمديد، فلماذا لا تجعل واحدة فقط تقوم بإرجاع القيمة أو الافتراضي:

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

نصائح أخرى

C # بالفعل يتيح لنا القيم البديلة null مع ??. وبعد لذلك كل ما نحتاج إليه هو امتداد يحول سلسلة فارغة null, ، ثم نستخدمها مثل هذا:

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

أعلم أن هذا سؤال قديم - لكنني كنت أبحث عن إجابة ولم يتناسب أي مما سبق حاجتي وكذلك انتهى بي الأمر باستخدام:

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));

لدي بضع ملحقات فائدة ترغب في استخدامها:

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.إجابة، سأضيف هذا البديل إلى Toolbox من الآن فصاعدا:

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

طريقة تمديد أسرع قليلا من المقترحة في وقت سابق ربما:

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

واحدة من مزايا المشغل الفاتح الفاتح هو أن الدوائر القصيرة. عندما يكون الجزء الأول غير فارغ، لم يتم تقييم الجزء الثاني. هذا يمكن أن يكون مفيدا عندما يتطلب التراجع عملية باهظة الثمن.

انتهى بي الأمر مع:

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);

أنا ببساطة استخدم طريقة تمديد NulliFempty والتي ستظهر دائما NULL إذا كانت السلسلة فارغة السماح؟ (مشغل التنافس الفاتح) لاستخدامه كالمعتاد.

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

هذا يسمح بعد ذلك؟ لاستخدامها كالمعتاد ويجعل التسلسل سهلة القراءة.

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

ماذا عن طريقة ملحق سلسلة 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;
}

لم تحاول هذه الحلول رغم ذلك.

أنا أستخدم طريقة تمديد سلسلة Coalsce الخاصة بي. نظرا لأن هؤلاء هنا يستخدمون 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);

أنا استخدامها كثيرا. واحدة من هذه الوظائف "الأداة المساعدة" التي لا يمكنك العيش بدونها بعد استخدامها أولا :-)

أنا أحب الإيجاز طريقة التمديد التالية QQQ لهذا، على الرغم من بالطبع مشغل مثل؟ سيكون أفضل. ولكن يمكننا أن نستخدم هذا من خلال السماح لم يكن فقط قيم خيار سلسلة فقط فقط مقارنة، والذي يواجه المرء الحاجة إلى التعامل مع كل الآن ثم (انظر الوظيفة الثانية أدناه).

#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
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top