كيف يمكنني إخبار عدد البدائل في سلسلة من التنسيق؟

StackOverflow https://stackoverflow.com/questions/3057080

سؤال

بالنظر إلى الطريقة التالية: (تحتوي الطريقة الحقيقية على عدد قليل من المعلمات ، ولكن المعالم المهمة أدناه ...)

public string DoSomething(string formatter, params string[] values)
{
    // Do something eventually involving a call to String.Format(formatter, values);
}

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

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

المحلول

ما زلت غير واضح لماذا تعتقد أنه لا يمكنك استخدامه string.Format لاختباره. إذا كان من المفترض أن يكون لدى تم تمريرها في التنسيق عناصر نائبة للعناصر في القيم ، فيجب أن تكون قادرًا على القيام بذلك:

static void TestFormat(string formatter, params string[] values)
{
    try
    {
        string.Format(formatter, values);
    }
    catch (FormatException e)
    {
        throw new Exception("the format is bad!!", e);
    }
}

استخدام العينة:

        TestFormat("{0}{1}{2}", "a", "b", "c"); // works ok
        TestFormat("{0}{1}{2}", "a", "b"); // throws exception
        TestFormat("{0}{1}{2}}0{", "a", "b", "c"); // throws exception

ستكون محاولة القيام بذلك بتعبير منتظم أمرًا صعبًا ، لأن ماذا عن شيء مثل هذا:

"{0}, {1}, {abc}, {1a4} {5} }{"

{abc} و {1a4} ليست صالحة ل string.Format, ، وعليك أيضًا تحديد كل رقم صالح ({0}, {1}, {5}) أن لديك على الأقل العديد من الحجج. أيضا ، }{ سوف تسبب string.format فشل كذلك.

لقد استخدمت للتو النهج السابق الموضح أعلاه في مشروع حديث وعمل بشكل رائع.

نصائح أخرى

أعتقد أنك تقلق كثيرًا بشأن هذا. إذا كانت سلسلة التنسيق غير صالحة ، فدع string.Format رمي الاستثناء لك. إذا كنت لا تريد ملف FormatException أن يتم إلقاؤها ، ومسكه ورمي الاستثناء الذي تريده.

كما أنه لا ينبغي أن تكون مشكلة في الحقيقة أنك قمت بالفعل ببعض المعالجة (على سبيل المثال ، تقييم تحويلات Lambda) لأن هذا هو بعد كل شيء ظرف استثنائي (مع استثناء أن Lambdas مكلفة للغاية ، وفي هذه الحالة تفعل string.Format اختبر أولاً دون معالجة الوسائط للتحقق من أنها صالحة ثم كررها عندما تحتاج إلى ذلك لاحقًا بعد المعالجة).

استخدم regex لحساب عدد القوالب ، ولكن كن حذرًا ، لأن

string.Format("{0}{0}", 123)

صالح.

تحتاج حقًا إلى تقديم مزيد من المعلومات لهذا السؤال ليتم الإجابة عليها جيدًا ...

يمكنك القيام بإعادة الصياغة لتنسيق الدعامة ثم قارنها بطول صفيف القيمة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top