Neden “abcd” .StartsWith (“”) true döndürüyor?


88

Başlık, sorunun tamamıdır. Birisi bana bunun neden olduğuna bir sebep verebilir mi?

Yanıtlar:


164

Evet - çünkü boş dizeyle başlıyor. Aslında, boş dizge mantıksal olarak her karakter çifti arasında oluşur.

Şöyle söyleyin: "ile başlar" ın bunu engelleyebilecek hangi tanımını verebilirdiniz? Aşağıda, "şununla başlar" ın basit bir tanımı vardır, ancak bunlar şu şekilde değildir:

"x'in ilk y.Lengthkarakterleri y'ninkilerle eşleşirse x, y ile başlar."

Alternatif (eşdeğer) bir tanım:

"x, y ile başlar eğer x.Substring(0, y.Length).Equals(y)"


3
x, y ile başlar, eğer x. Substring (0, y.Length). Eşittir (y), ancak ve ancak y.Length> 0 ise
Vinko Vrsalovic

8
Evet, bu vakayı gerçekten de açıkça hariç tutabilirsiniz. Yine de oldukça uygunsuz bir tanım, değil mi?
Jon Skeet

7
Doğru. Aynı zamanda bunların boş olmamalarını da gerektirir ... ancak bunların her ikisinin de basit tanımın ruhundan uzaklaşırken doğruluğa katkıda bulunduğunu söyleyebilirim :)
Jon Skeet

8
Her karakter çifti arasında sonsuz sayıda boş dizge oluşur.
Lotus Notes

3
Evet, bir sayıdan önce sıfır koymak gibidir - Değeri değiştirmez, ancak hala mevcuttur.
pop850

47

Jon Skeet'in söylediklerini detaylandırmaya çalışacağım.

Diyelim ki x, y ve z dizelerdir ve + operatörü aslında bitiştirmedir, o zaman:

Z'yi z = x + y yazmak için bölebilirsek, bu z'nin x ile başladığı anlamına gelir. Her z dizisi z = "" + z'ye bölünebildiğinden, her dizenin "" ile başladığı sonucu çıkar.

Yani, ("" + "abcd") == "abcd" olduğu için "abcd" nin ""


18

Anlaşılması daha kolay olan ilgili bir gerçekle başlayacağım.

Boş küme, her kümenin bir alt kümesidir.

Neden? Altkümenin tanımı , öğesinin her öğesinin öğesinin bir öğesi olup olmadığının bir alt kümesi olduğunu belirtir . Tersine, öğesinin öğesi olmayan bir öğesi olup olmadığının bir alt kümesi değildir .ABABABAB

Şimdi bir seti düzeltin B. Boş kümenin bir alt kümesi olduğunu belirleyeceğim B. Bunu, boş kümenin bir alt kümesi olmadığını göstererek yapacağım B. Boş küme, Böğesinin bir alt kümesi değilse, içinde olmayan boş kümenin bir öğesini bulabilirim B. Ama boş küme herhangi bir elemana sahip değil ve bu yüzden içinde olmayan bir eleman bulamıyorum B. Bu nedenle, boş kümenin bir alt kümesi olmadığı durum söz konusu değildir B. Bu nedenle, boş küme, alt kümesi olmalıdır B.

Herhangi bir dize boş dizeyle başlar.

İlk olarak, ile başlangıç tanımımız üzerinde anlaşmalıyız . Let sand tbe strings Diyoruz ki, if s ile başlar ve karakterlerin ilk karakterleri ile eşleşir . Yani, her için böyle , doğrudur. Tersine, bunun eğer ifade ile başlamadığını söyleyebiliriz.ts.Length >= t.Lengtht.Lengthtss.Length >= t.LengthInt32 index0 <= index < t.Lengths[index] == t[index]st

s.Length < t.Lengthveya s.Length >= t.Lengthve Int32 indexböyle bir şey var 0 <= index < t.Lengthves[index] != t[index]

doğru. Düz İngilizce'de, sdaha kısadır tveya değilse, taynı konumdaki karakterle eşleşmeyen bir karakter vardır s.

Şimdi bir dizeyi düzeltin s. Bunun sboş dizeyle başladığını belirleyeceğim. Bunu sboş dizeyle başlamayan durumun olmadığını göstererek yapacağım . Eğer so zaman boş dize ile başlamaz s.Length < String.Empty.Lengthveya s.Length >= String.Empty.Lengthbir var Int32 indexböyle 0 <= index < String.Empty.Length. Ama s.Length >= 0ve String.Empty.Lengthbunun için imkansız yani sıfıra eşittir s.Length < String.Empty.Lengthgerçek olamayacak. Benzer şekilde, `String.Empty.Length is equal to zero, there is noInt32 indeksi satisfying0 <= index <String.Empty.Length`. Bu nedenle

s.Length < String.Empty.Lengthya da s.Length >= String.Empty.Lengthöyle bir şey var Int32 indexki0 <= index < String.Empty.Length

yanlış. Bu nedenle sboş dizge ile başlamayan durum böyle değildir. Bu nedenle, sboş dizeyle başlamalıdır.

Aşağıdaki, uzantısı olarak kodlanmış başlangıçların bir uygulamasıdır 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;
}

Yukarıdaki iki cesur gerçek , boş bir şekilde doğru ifadelerin örnekleridir . Onları tanımlayan ifadelerin ( alt küme ve onunla başlayan ) boş evrenler üzerindeki evrensel nicelikler olması nedeniyle doğrudurlar . Boş kümede öğe yoktur, bu nedenle başka bir sabit kümede olmayan boş kümenin herhangi bir öğesi olamaz. Boş dizede karakter yoktur, bu nedenle boş dizedeki bazı konumlar başka bir sabit dizede aynı konumdaki karakterle eşleşmediği için bir karakter olamaz.


17

Bu yöntem, değer parametresini, değerle aynı uzunluktaki bu dizenin başındaki alt dizeyle karşılaştırır ve eşit olup olmadıklarını gösteren bir değer döndürür. Eşit olması için değerin boş bir dize (Boş) olması, aynı örneğe bir başvuru olması veya bu örneğin başlangıcıyla eşleşmesi gerekir.

.NET String.StartsWith

bağımsız değişken tarafından temsil edilen karakter dizisi, bu dizeyle temsil edilen karakter dizisinin bir öneki ise true; aksi takdirde false. Ayrıca, bağımsız değişken boş bir dizeyse veya equals (Object) yöntemiyle belirlendiği gibi bu String nesnesine eşitse true değerinin döndürüleceğini unutmayın .

Java String.startsWith


13

Sadece söyleyelim "abcd".StartsWith("") yanlış döndürür .

eğer öyleyse, aşağıdaki ifade neyi değerlendirir, doğru veya yanlış:

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

sonuç olarak değişmesi doğru olur, böylece dizge boş dizgeyle başlar ;-) veya başka bir deyişle, "abcd" nin 0 konumundan başlayan ve uzunluğu 0 olan "" alt dizesi boş dizgeye eşittir "". Oldukça mantıklı bir imo.


"Abcd" .Substring (0, 0) 'ın boş bir dizge döndürmesi, "abcd" nin aslında boş bir dizeyle başladığı anlamına gelmez. Sonuç, nulleşit derecede uygun bir dönüş değeri olacağı gibi 'tanımsız' olarak da ilan edilmiş olabilir .
Tom Lint

@TomLint Hayır. Genellikle IE x.FirstName.StartsWith (userEnteredFirstName) && x.LastName.StartsWith (userEnteredLastName) .... koşullarını birleştirirsiniz .... Bu, girilen valeuslardan biri boş dizge olsa bile koşulun çalışmasını sağlar.
Pop Catalin

7

C # 'da spesifikasyon ona nasıl tepki vermesini söyler;

Eşit olması için değerin boş bir dize (Boş) olması, aynı örneğe bir başvuru olması veya bu örneğin başlangıcıyla eşleşmesi gerekir.


5

İki dizenin ilk N karakteri aynıdır. N, ikinci dizenin uzunluğudur, yani sıfır.


5

Neden “abcd” .StartsWith (“”) true döndürüyor?

GERÇEK CEVAP:

Bu şekilde olmalı, aksi halde davaya sahip olurdun

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

    but yet

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

ve sonra yeniden Y2K'ya sahip olurduk çünkü kendilerinden başlayarak eşit dizelere dayanan tüm banka yazılımları hesaplarımızı karıştıracak ve aniden Bill Gates benim servetim olacak ve ben de onunkine sahip olacağım ve lanet olsun! Kader bana pek iyi gelmiyor.


Katılmıyorum. "" .startsWith ("") doğru olmalıdır, çünkü dizeler aynıdır ve bazı garip iş mantığı nedeniyle değil.
Tom Lint

@TomLint Aslında cevaptaki iddiaya katılıyorsunuz ...
neonblitzer

4

Sadece kayıt için, String.StartsWith()dahili System.Globalization.CultureInfo.IsPrefix()olarak aşağıdaki kontrolü açıkça yapan yöntemi çağırır :

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

1

Çünkü bir dizge "hiç" ile iyi başlar.


1
... yani string.empty hiçbir şey değilse! Bu aşırı basitleştirme genelleştirilemez. Daha önceden belirlenmiş teori odaklı tartışmaları takip etmemizi öneriyorum.
Pita.O

1

Bunu normal ifadelerle düşünürseniz, mantıklı geliyor. Her dizge (sadece "abcd" değil, ayrıca "" ve "sdf \ nff"), 'boş dizeyle başlar' normal ifadesini değerlendirirken true değerini döndürür.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.