سؤال

لدي مجموعة من الأوتار التي أحتاج إلى استخدامها. trim () ، ولكن يمكن أن تكون فارغة. سيكون أكثر إيجازًا إذا كان بإمكاني فعل شيء مثل:

string endString = startString !?? startString.Trim();

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

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

المحلول

يمكنك إنشاء طريقة تمديد تعود null عندما تحاول تقليم القيمة.

public String TrimIfNotNull(this string item)
{
   if(String.IsNullOrEmpty(item))
     return item;
   else
    return item.Trim();
}

لاحظ أنه لا يمكنك تسميته لأن أساليب التمديد لا يمكنها تجاوز طرق المثيل.

نصائح أخرى

ليس للمواصفات: لا يعجبني ذلك ، لكن يمكنك استخدامه:

string endString = (startString ?? String.Empty).Trim();

إلى المواصفات ، أفضل كطريقة تمديد مثل @kevin's:

string endString = (startString == null ? null : startString.Trim());
string endString = string.IsNullOrEmpty(startString) ? startString : startString.Trim();

على الرغم من أنني ذهبت أيضًا إلى طريق كتابة طريقة تمديد سلسلة تسمى "Safetrim" والتي تقوم بما تصفه بطريقة واحدة بدلاً من الاضطرار إلى استخدام هذه الوصفة في كل مرة. الدفع مسترجع كيفن للرمز.

تعديل: واو كان لدي كل أنواع من المتغيرات للخلف ، والمتغيرات المسمى بشكل خاطئ ومشغلات ثلاثية عكسية ، والسبب الآخر لكتابة طريقة تمديد واحدة والرمز أفضل مما فعلت!

يستخدم

string endString = (startString ?? "").Trim();

هذا يستخدم سلسلة Empy إذا كان StartString فارغًا. هذا ، ومع ذلك ، يفعل ليس إرجاع فارغ متى endString باطل.

آسف على مستحضر الأرواح ، لكنني كنت أواجه نفس المشكلة وحل هذا باستخدام عملية Lambda. إنه ليس أجمل ، لكنه يحافظ على الكود الخاص بي.

إنه لأمر مخز ، لا يدعم الواردات الثابتة أو الواردات الفردية ، ولكن على أي حال:

حدد هذه الوظيفة في مكان ما:

private static TResult N<TParent,TResult>(TParent parent, Func<TParent,TResult> operation) {
    if( parent == null ) return default(TResult);
    return operation( parent );
}

ثم لاستخدامه في مثالك:

String endString = N(startString, s => s.Trim());

ال N عودة الوظيفة null إذا كانت الوسيطة الأولى لاغية ، وإلا فإنها ستقوم بتقييم وظيفة Lambda المحددة مع القيمة كوسيطة.

يمكنك عشه ، بالطبع ، مثل ذلك. على سبيل المثال ، لإرهاق سلسلة طويلة بأمان ، على سبيل المثال

String someValue = someObject.SomeProperty.SomeOtherProperty.SomeMethod().SomeFinalProperty;

إذا كانت أي من هذه الخصائص أو الأساليب تُرجع خالية ، فيجب عليك إدراج شيكات فارغة في كل مكان ، أو يمكنك القيام بذلك:

String someValue = N(N(N(N(someObject, o => o.SomeProperty), o => o.SomeOtherProperty), o => o.SomeMethod()), o => o.SomeFinalProperty);

كما قلت ، ليس أجمل :)

يمكنك تبسيط هذا من خلال صنع N طريقة تمديد System.Object, ، مثل ذلك:

String someValue = someObject.N( o => o.SomeProperty ).N( o => o.SomeOtherProperty ).N( o => o.SomeMethod() ).N( o => o.SomeFinalProperty );

... والتي أعتقد أنها أكثر وضوحا.

ما يلي لا ينتشر NULL ولكنه يقبل NULL كمعلمة ويعيد سلسلة فارغة في هذه الحالة.

using Microsoft.VisualBasic;  // you need to add a reference to Microsoft.VisualBasic.dll

    ...
    string endString = Strings.Trim(startString);
    ...

بطة وركض ...

قم بإنشاء طريقة مثل:

string MyTrim(string a) {
    if (a != null) {
        a = a.Trim();
    }
    return a;
}

كملاحظة جانبية ، إذا كنت تستخدم .NET 4 ، فهناك طريقة جديدة مريحة String.IsNullOrWhiteSpace الذي يمكنك استخدامه.

بدءًا من C# 6.0 (.NET Framework 4.6 / Visual Studio 2015) يمكنك استخدام وصول العضو الشرطي الفارغ:

 string? endString = startString?.Trim();
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top