سؤال

العنوان هو السؤال برمته.هل يمكن لأحد أن يعطيني سبب حدوث ذلك؟

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

المحلول

نعم - لأنها تبدأ بالسلسلة الفارغة.في الواقع، تحدث السلسلة الفارغة منطقيًا بين كل زوج من الأحرف.

ضعها بهذه الطريقة:ما هو تعريف "يبدأ بـ" الذي يمكن أن تقدمه والذي من شأنه أن يمنع ذلك؟فيما يلي تعريف بسيط لكلمة "يبدأ بـ" ولكن لا:

"x يبدأ بـ y إذا كان الأول y.Length أحرف x تتطابق مع أحرف y."

تعريف بديل (معادل):

"x يبدأ بـ y إذا x.Substring(0, y.Length).Equals(y)"

نصائح أخرى

سأحاول توضيح ما قاله جون سكيت.

لنفترض أن x وy وz عبارة عن سلاسل وأن العامل + هو في الواقع سلسلة، إذن:

إذا تمكنا من تقسيم z لكتابة z = x + y فهذا يعني أن z يبدأ بـ x.نظرًا لأنه يمكن تقسيم كل سلسلة z إلى z = "" + z، فإن ذلك يعني أن كل سلسلة تبدأ بـ "".

لذا، نظرًا لأن ("" + "abcd") == "abcd" فإن ذلك يعني أن "abcd" يبدأ بـ ""

تقارن هذه الطريقة معلمة القيمة بالسلسلة الفرعية الموجودة في بداية هذه السلسلة والتي لها نفس طول القيمة، وتقوم بإرجاع قيمة تشير إلى ما إذا كانت متساوية أم لا. لكي تكون القيمة متساوية، يجب أن تكون القيمة عبارة عن سلسلة فارغة (فارغة)، أو إشارة إلى هذا المثيل نفسه، أو تطابق بداية هذا المثيل.

.NET String.StartsWith

صحيح إذا كان تسلسل الأحرف الذي تمثله الوسيطة هو بادئة لتسلسل الأحرف الذي تمثله هذه السلسلة؛كاذبة خلاف ذلك. لاحظ أيضًا أنه سيتم إرجاع true إذا كانت الوسيطة عبارة عن سلسلة فارغة أو يساوي كائن السلسلة هذا كما هو محدد بواسطة طريقة يساوي (كائن).

جافا String.startsWith

سأبدأ بحقيقة ذات صلة يسهل فهمها.

المجموعة الفارغة هي مجموعة فرعية من كل مجموعة.

لماذا؟ال تعريف ل مجموعة فرعية ينص علي A هي مجموعة فرعية من B إذا كان كل عنصر من A هو عنصر من B.على العكس من ذلك، A ليست مجموعة فرعية من B إذا كان هناك عنصر من A هذا ليس عنصرا من B.

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

أي سلسلة تبدأ بالسلسلة الفارغة.

أولا يجب أن نتفق على تعريفنا لـ ابدا ب.يترك s و t يكون stringنحن نقول ذلك s ابدا ب t لو s.Length >= t.Length والأول t.Length شخصيات من t تطابق تلك s.إنه، s.Length >= t.Length ولكل Int32 index مثل ذلك 0 <= index < t.Length, s[index] == t[index] صحيح.على العكس من ذلك، كنا نقول ذلك s لا يبدأ ب t إذا كان البيان

s.Length < t.Length أو s.Length >= t.Length وهناك Int32 index مثل ذلك 0 <= index < t.Length و s[index] != t[index]

صحيح.في سهل الانجليزية، s أقصر من t, ، أو، إذا لم يكن الأمر كذلك، هناك حرف في t لا يتطابق مع الحرف كما في نفس الموضع s.

الآن قم بإصلاح السلسلة s.سأثبت ذلك s يبدأ بالسلسلة الفارغة.سأفعل ذلك من خلال إظهار أن الأمر ليس كذلك s لا يبدأ بالسلسلة الفارغة.لو s لا يبدأ بالسلسلة الفارغة بعد ذلك s.Length < String.Empty.Length أو s.Length >= String.Empty.Length وهناك Int32 index مثل ذلك 0 <= index < String.Empty.Length.لكن s.Length >= 0 و String.Empty.Length يساوي الصفر لذلك فمن المستحيل ل s.Length < String.Empty.Length ليكون صحيحا.وبالمثل، منذ ``String.Empty.Lengthis equal to zero, there is noمؤشر Int32satisfying0 <= الفهرس < String.Empty.Length`.لذلك

s.Length < String.Empty.Length أو s.Length >= String.Empty.Length وهناك Int32 index مثل ذلك 0 <= index < String.Empty.Length

هو زائف.ولذلك، ليس الأمر كذلك s لا يبدأ بالسلسلة الفارغة.هكذا، s يجب أن تبدأ بالسلسلة الفارغة.

وفيما يلي تنفيذ ابدا ب مشفرة كامتداد ل string.

public static bool DoStartsWith(this string s, string t) {
    if (s.Length >= t.Length) {
        for (int index = 0; index < t.Length; index++) {
            if (s[index] != t[index]) {
                return false;
            }
        }
        return true;
    }
    return false;
}

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

دعنا نقول فقط "abcd".StartsWith("") يعود كاذبة.

إذا كان الأمر كذلك فما قيمة التعبير التالي، صحيح أم خطأ:

 ("abcd".Substring(0,0) == "")

اتضح أن القيمة صحيحة، لذا فإن السلسلة تبدأ بالسلسلة الفارغة؛-)، أو بعبارة أخرى، السلسلة الفرعية لـ "abcd" تبدأ من الموضع 0 ولها طول 0 يساوي السلسلة الفارغة "".إيمو منطقية جدا.

في C# هذه هي الطريقة تخصيص يقول لها أن تتفاعل؛

لكي تكون القيمة متساوية، يجب أن تكون القيمة عبارة عن سلسلة فارغة (فارغة)، أو إشارة إلى هذا المثيل نفسه، أو تطابق بداية هذا المثيل.

لماذا يعود "abcd".StartsWith("") صحيحًا؟

الجواب الحقيقي:

يجب أن يكون الأمر بهذه الطريقة وإلا سيكون لديك الحالة حيث

    "".startsWith("") == false 
    "".equals("") == true

    but yet

    "a".startsWith("a") == true
    "a".equals("a") == true

ومن ثم سيكون لدينا عام 2000 مرة أخرى لأن جميع البرامج المصرفية التي تعتمد على سلاسل متساوية تبدأ بنفسها سوف تختلط حساباتنا وفجأة سيحصل بيل جيتس على ثروتي وسأحصل على ثرواته، واللعنة!القدر ليس من هذا النوع بالنسبة لي.

الأحرف N الأولى من السلسلتين متطابقة.N هو طول السلسلة الثانية، أي.صفر.

فقط للتسجيل، String.StartsWith() يستدعي الأسلوب داخليًا System.Globalization.CultureInfo.IsPrefix() مما يجعل التحقق التالي بشكل صريح:

if (prefix.Length == 0)
{
    return true;
}

لأن السلسلة تبدأ جيدًا بـ "لا شيء".

إذا فكرت في الأمر من حيث التعبيرات العادية، فمن المنطقي.كل سلسلة (وليس فقط "ABCD" ، وأيضًا "" و "SDF NFF") ، تُرجع صحيحًا عند تقييم التعبير العادي لـ "يبدأ بسلسلة فارغة".

في C#، سبب إرجاعه true هو أن المطورين قاموا بترميزها خصيصًا لذلك.

إذا قمت بفحص مصدر الرمز, ستجد منطقًا محددًا للتعامل مع سلسلة فارغة:

public Boolean StartsWith(String value)
{
    return StartsWith(value, StringComparison.CurrentCulture);
}

public Boolean StartsWith(String value, StringComparison comparisonType)
{
    ...

    if (value.Length == 0)
    {
        return true;
    }
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top