Perché "abcd" .StartsWith ("") restituisce true?


87

Il titolo è l'intera domanda. Qualcuno può darmi una ragione per cui questo accade?

Risposte:


164

Sì, perché inizia con la stringa vuota. Infatti, la stringa vuota si verifica logicamente tra ogni coppia di caratteri.

Mettiamola così: quale definizione di "inizia con" potresti dare che lo precluderebbe? Ecco una semplice definizione di "inizia con" che non lo fa:

"x inizia con y se i primi y.Lengthcaratteri di x corrispondono a quelli di y."

Una definizione alternativa (equivalente):

"x inizia con y se x.Substring(0, y.Length).Equals(y)"


3
x inizia con y se x. Sottostringa (0, y. lunghezza). Uguale a (y) se e solo se y. Lunghezza> 0
Vinko Vrsalovic

8
Sì, potresti davvero escludere esplicitamente questo caso. È una definizione piuttosto inelegante, non è vero?
Jon Skeet

7
Vero. Richiede anche che siano non nulli ... ma direi che entrambi aumentano l'accuratezza mentre tolgono lo spirito della semplice definizione :)
Jon Skeet

8
Tra ogni coppia di caratteri si verificano infinite occorrenze della stringa vuota.
Lotus Notes,

3
Sì, è proprio come mettere uno zero prima di un numero - Non cambia il valore eppure esiste ancora.
pop850

47

Cercherò di elaborare ciò che ha detto Jon Skeet.

Diciamo che x, yez sono stringhe e l'operatore + è in effetti una concatenazione, quindi:

Se possiamo dividere z per scrivere z = x + y, significa che z inizia con x. Poiché ogni stringa z può essere divisa in z = "" + z, ne consegue che ogni stringa inizia con "".

Quindi, poiché ("" + "abcd") == "abcd" segue che "abcd" inizia con ""


17

Questo metodo confronta il parametro value con la sottostringa all'inizio di questa stringa che ha la stessa lunghezza di value e restituisce un valore che indica se sono uguali. Per essere uguale, il valore deve essere una stringa vuota (Empty), un riferimento a questa stessa istanza o corrispondere all'inizio di questa istanza.

.NET String.StartsWith

true se la sequenza di caratteri rappresentata dall'argomento è un prefisso della sequenza di caratteri rappresentata da questa stringa; altrimenti falso. Nota anche che verrà restituito true se l'argomento è una stringa vuota o è uguale a questo oggetto String come determinato dal metodo equals (Object).

Java String.startsWith


17

Inizierò con un fatto correlato che è più facile da capire.

L'insieme vuoto è un sottoinsieme di ogni insieme.

Perché? La definizione di sottoinsieme afferma che Aè un sottoinsieme di Bse ogni elemento di Aè un elemento di B. Al contrario, Anon è un sottoinsieme di Bse c'è un elemento di Ache non è un elemento di B.

Ora aggiusta un set B. Stabilirò che l'insieme vuoto è un sottoinsieme di B. Lo farò mostrando che non è vero che l'insieme vuoto non è un sottoinsieme di B. Se l'insieme vuoto non fosse un sottoinsieme di Ballora potrei trovare un elemento dell'insieme vuoto che non è in B. Ma l'insieme vuoto non ha elementi e quindi non riesco a trovare un elemento che non sia in B. Pertanto, non è vero che l'insieme vuoto non è un sottoinsieme di B. Pertanto, l'insieme vuoto deve essere un sottoinsieme di B.

Qualsiasi stringa inizia con la stringa vuota.

In primo luogo, dobbiamo essere d'accordo sulla nostra definizione di inizia con . Let sand tbe strings Diciamo che s inizia con t if s.Length >= t.Lengthei primi t.Lengthcaratteri di tcorrispondono a quelli di s. Cioè, s.Length >= t.Lengthe per ogni cosa del Int32 indexgenere 0 <= index < t.Length, s[index] == t[index]è vero. Al contrario, diremmo che snon inizia con tl'istruzione if

s.Length < t.Lengtho s.Length >= t.Lengthe c'è un Int32 indextale che 0 <= index < t.Lengthes[index] != t[index]

è vero. In parole povere, sè più corto di t, o, in caso contrario, c'è un carattere tnon corrispondente al carattere della stessa posizione in s.

Ora aggiusta una stringa s. Stabilirò che sinizi con la stringa vuota. Lo farò mostrando che non è il caso che snon inizi con la stringa vuota. Se snon inizia con la stringa vuota allora s.Length < String.Empty.Lengtho s.Length >= String.Empty.Lengthe c'è un Int32 indextale che 0 <= index < String.Empty.Length. Ma s.Length >= 0e String.Empty.Lengthè uguale a zero, quindi è impossibile s.Length < String.Empty.Lengthche sia vero. Allo stesso modo, poiché `` String.Empty.Length is equal to zero, there is noInt32 index satisfying0 <= index <String.Empty.Length`. Perciò

s.Length < String.Empty.Lengtho s.Length >= String.Empty.Lengthe c'è un Int32 indextale che0 <= index < String.Empty.Length

è falso. Pertanto, non è il caso che snon inizi con la stringa vuota. Pertanto, sdeve iniziare con la stringa vuota.

Quella che segue è un'implementazione di inizia con codificato come estensione di 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;
}

I due fatti in grassetto sopra sono esempi di affermazioni vacuamente vere . Sono vere in virtù del fatto che le affermazioni che le definiscono ( sottoinsieme e inizia con ) sono quantificazioni universali su universi vuoti. Non ci sono elementi nel set vuoto, quindi non possono esserci elementi del set vuoto non in qualche altro set fisso. Non ci sono caratteri nella stringa vuota, quindi non può esserci un carattere in quanto una posizione nella stringa vuota non corrisponde al carattere nella stessa posizione in qualche altra stringa fissa.


13

Diciamo solo che "abcd".StartsWith("")restituisce false.

in tal caso, a cosa serve la seguente espressione, vero o falso:

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

risulta che è uguale a vero, quindi la stringa inizia con la stringa vuota ;-), o in altre parole, la sottostringa di "abcd" che inizia alla posizione 0 e con lunghezza 0 è uguale alla stringa vuota "". Imo abbastanza logico.


Il fatto che "abcd" .Substring (0, 0) restituisca una stringa vuota non significa che "abcd" inizi effettivamente con una stringa vuota. Il risultato potrebbe anche essere stato dichiarato "non definito", poiché nullsarebbe stato un valore restituito altrettanto appropriato.
Tom Lint

@TomLint No. Di solito si combinano le condizioni IE x.FirstName.StartsWith (userEnteredFirstName) && x.LastName.StartsWith (userEnteredLastName) .... Ciò fa funzionare la condizione anche se uno dei valori immessi è una stringa vuota.
Pop Catalin,

7

In C # questo è il modo in cui la specifica gli dice di reagire;

Per essere uguale, il valore deve essere una stringa vuota (Empty), un riferimento a questa stessa istanza o corrispondere all'inizio di questa istanza.


5

I primi N caratteri delle due stringhe sono identici. N è la lunghezza della seconda stringa, cioè zero.


5

Perché "abcd" .StartsWith ("") restituisce true?

LA VERA RISPOSTA:

Deve essere così altrimenti avresti il ​​caso in cui

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

    but yet

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

e poi avremmo di nuovo Y2K perché tutto il software della banca che dipende da stringhe uguali a partire da se stesse confonderà i nostri conti e improvvisamente Bill Gates avrà la mia ricchezza e io la sua, e dannazione! Il destino non è così gentile con me.


Non sono d'accordo. "" .startsWith ("") dovrebbe essere true, perché le stringhe sono identiche e non a causa di una strana logica aziendale.
Tom Lint

@TomLint Sei in effetti d'accordo con l'affermazione nella risposta ...
neonblitzer

4

Solo per la cronaca, String.StartsWith()chiama internamente il metodo System.Globalization.CultureInfo.IsPrefix()che effettua esplicitamente il seguente controllo:

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

1

Perché una stringa inizia bene con "niente".


1
... cioè se string.empty non è niente! Questa semplificazione eccessiva non può essere generalizzata. Suggerisco di seguire le discussioni più orientate alla teoria degli insiemi.
Pita.O

1

Se ci pensi in termini di espressioni regolari, ha senso. Ogni stringa (non solo "abcd", anche "" e "sdf \ nff"), restituisce true quando si valuta l'espressione regolare di 'inizia con una stringa vuota'.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.