88 votes

Pourquoi ne "abcd".StartsWith("") return true?

Le titre est l'ensemble de la question. Quelqu'un peut-il me donner une raison pourquoi cela se produit?

164voto

Jon Skeet Points 692016

Oui - parce qu'il ne fait que commencer avec la chaîne vide. En effet, la chaîne vide logiquement se produit entre chaque paire de caractères.

Mettez-le de cette façon: quelle définition de la "commence par" pourriez-vous donner qui pourrait empêcher cela? Voici une définition simple du terme "commence par" qui n'est pas le cas:

"x commence par y si le premier y.Length personnages de x correspondent à celles de y."

Une solution de remplacement (l'équivalent) définition:

"x commence par y si x.Substring(0, y.Length).Equals(y)"

47voto

Petar Repac Points 2429

Je vais essayer d'élaborer sur ce que Jon Skeet dit.

Disons que x, y et z sont des chaînes de caractères et l'opérateur + est en fait la concaténation, puis:

Si nous pouvons diviser z pour écrire z = x + y qui signifie que z commence par x. Parce que chaque chaîne de z peut être scindée pour z = "" + z il s'ensuit que chaque chaîne de caractères commence par "".

Ainsi, parce que ("" + "abcd") == "abcd" il en résulte que "abcd" commence par ""

19voto

Jason Points 125291

Je vais commencer avec une relative fait que c'est plus facile à comprendre.

L'ensemble vide est un sous-ensemble de tous les ensembles.

Pourquoi? La définition du sous-ensemble d'états qui A est un sous-ensemble de l' B si chaque élément de l' A est un élément de l' B. À l'inverse, A n'est pas un sous-ensemble de l' B si il est un élément de A qui n'est pas un élément de l' B.

Maintenant fixer une B. Je vais établir que l'ensemble vide est un sous-ensemble de l' B. Je vais le faire en montrant qu'il n'est pas le cas que l'ensemble vide n'est pas un sous-ensemble de l' B. Si l'ensemble vide n'étaient pas un sous-ensemble de l' B alors que j'ai pu trouver un élément de l'ensemble vide qui n'est pas en B. Mais l'ensemble vide n'ont pas tous les éléments, et donc je ne peux pas trouver un élément qui n'est pas en B. Par conséquent, il n'est pas le cas que l'ensemble vide n'est pas un sous-ensemble de l' B. Ainsi, l'ensemble vide doit être un sous-ensemble de l' B.

Toute chaîne de caractères commence par la chaîne vide.

Tout d'abord, il faut reconnaître que notre définition de l' commence avec. Laissez - s et t être strings Nous dire qu' s commence par t si s.Length >= t.Length et le premier t.Length caractères d' t correspondent à ceux de l' s. C'est, s.Length >= t.Length et pour chaque Int32 index tels que 0 <= index < t.Length, s[index] == t[index] est vrai. A l'inverse, nous dirions qu' s ne démarre pas avec l' t si la déclaration

s.Length < t.Length ou s.Length >= t.Length et il y a un Int32 index tels que 0 <= index < t.Length et s[index] != t[index]

est vrai. En clair, s est plus courte que t, ou, si non, il y a un personnage en t ne correspond pas au caractère de la même position en s.

Maintenant fixer une chaîne de caractères s. Je vais établir qu' s commence avec la chaîne vide. Je vais le faire en montrant qu'il n'est pas le cas qu' s ne démarre pas avec la chaîne vide. Si s ne démarre pas avec la chaîne vide, alors s.Length < String.Empty.Length ou s.Length >= String.Empty.Length et il y a un Int32 index tels que 0 <= index < String.Empty.Length. Mais s.Length >= 0 et String.Empty.Length est égal à zéro alors il est impossible s.Length < String.Empty.Length pour être vrai. De même, depuis `String.Empty.Length est égal à zéro, il n'y a pas d' Int32 index satisfaction 0 <= index < String.Empty.Length. Donc

s.Length < String.Empty.Length ou s.Length >= String.Empty.Length et il y a un Int32 index tels que 0 <= index < String.Empty.Length

est faux. Par conséquent, il n'est pas le cas qu' s ne démarre pas avec la chaîne vide. Ainsi, s doit commencer avec la chaîne vide.

Ce qui suit est une mise en œuvre de commence avec codé comme une extension d' 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;
}

Les deux ci-dessus en gras les faits sont des exemples de vacuously des déclarations exactes. Elles sont vraies en vertu du fait que les déclarations de les définir (sous-ensemble et commence avec) sont universels quantifications sur vide univers. Il n'y a pas d'éléments dans l'ensemble vide, donc il y a peut-être pas tous les éléments de l'ensemble vide et non dans un autre ensemble fixe. Il n'y a pas de caractères dans la chaîne vide, donc il ne peut pas être un personnage comme une position dans la chaîne vide ne correspond pas au personnage dans la même position dans certains autres chaîne fixe.

17voto

Firas Assaad Points 10339

Cette méthode permet de comparer la valeur de paramètre de la sous-chaîne au début de cette chaîne qui est de la même longueur que la valeur, et renvoie une valeur qui indique si elles sont égales. Pour être égaux, la valeur doit être une chaîne vide (Vide), une référence à cette même instance, ou d'un match, le début de cette instance.

.NET de la Chaîne.StartsWith

vrai si la séquence de caractères représenté par l'argument est un préfixe de la séquence de caractères représenté par cette chaîne; false dans le cas contraire. Notez également que la valeur true est renvoyée si l'argument est une chaîne vide ou égale à cette Chaîne de l'objet tel que déterminé par la equals(Object) de la méthode.

Java Chaîne.startsWith

13voto

Pop Catalin Points 25033

Disons "abcd".StartsWith("") renvoie la valeur false.

si oui, alors ce n'est l'expression suivante eval, vrai ou faux:

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

il s'avère que est évaluée comme vraie, de sorte que la chaîne ne démarre avec la chaîne vide ;-), ou en d'autres termes, la sous-chaîne "abcd" commençant à la position 0 et ayant de longueur 0 est égale à la chaîne vide "". Assez logique de l'omi.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X