タイトルは質問全体です。誰かが私にこれが起こる理由を教えてもらえますか?
11 に答える
はい - 空の文字列で始まるためです。実際、空の文字列はすべての文字のペアの間に論理的に発生します。
このように言えば、これを排除する「で始まる」のどの定義を与えることができますか? 「で始まる」の簡単な定義は次のとおりです。
「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"は""で始まります。
理解しやすい関連事実から始めます。
空集合はすべての集合のサブセットです。
なんで?のすべての要素が の要素である場合、 のサブセットであるサブセット状態の定義。逆に、の要素ではない の要素がある場合、 は のサブセットではありません。ABABABAB
セットを修正しますB。空集合が のサブセットであることを確認しBます。空集合が のサブセットではないということを示すことで、これを行いますB。空集合が のサブセットではない場合、 にない空集合Bの要素を見つけることができますB。しかし、空のセットには要素がないため、 にない要素を見つけることができませんB。したがって、空集合が の部分集合ではないというわけではありませんB。したがって、空集合は の部分集合でなければなりませんB。
どの文字列も空の文字列で始まります。
まず、starts withの定義に同意する必要があります。Let sand tbe s ifで始まり、 の最初の文字が の文字と一致するstringと言います。つまり、そのようなすべての に対して、は真です。逆に、 if ステートメントで始まらないと言うでしょう。s ts.Length >= t.Lengtht.Lengthtss.Length >= t.LengthInt32 index0 <= index < t.Lengths[index] == t[index]st
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、 andString.Empty.Lengthはゼロに等しいので、s.Length < String.Empty.Lengthが true であることは不可能です。同様に、 ``String.Empty.Length is equal to zero, there is noInt32 index satisfying0 <= index < String.Empty.Length`. したがって
s.Length < String.Empty.Lengthまたはs.Length >= String.Empty.Length、Int32 indexそのようなものがあります0 <= index < String.Empty.Length
は偽です。したがって、s空文字列で開始しないということはありません。したがって、s空の文字列で開始する必要があります。
以下は、の拡張としてコード化されたstart withstringの実装です。
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;
}
上記の 2 つの太字の事実は、空虚な真実の陳述の例です。それらを定義するステートメント ( subsetおよびstarts with ) が空の宇宙に対する普遍的な数量化であるという事実により、それらは真です。空集合には要素がないため、他の固定集合にない空集合の要素は存在できません。空の文字列には文字がないため、空の文字列のある位置が他の固定文字列の同じ位置にある文字と一致しないため、文字は存在できません。
このメソッドは、value パラメータを、value と同じ長さのこの文字列の先頭にある部分文字列と比較し、それらが等しいかどうかを示す値を返します。等しいためには、値が空の文字列 (Empty) であるか、この同じインスタンスへの参照であるか、このインスタンスの先頭と一致している必要があります。
引数によって表される文字シーケンスが、この文字列によって表される文字シーケンスのプレフィックスである場合は true 。それ以外の場合は false。また、引数が空の文字列であるか、equals(Object) メソッドによって決定されたこの String オブジェクトと等しい場合、true が返されることにも注意してください。
"abcd".StartsWith("")が false を返すとしましょう。
もしそうなら、次の式は true または false に評価されます:
("abcd".Substring(0,0) == "")
evals が true であることが判明したため、文字列は空の文字列で始まります ;-)、つまり、位置 0 から始まり、長さが 0 の "abcd" の部分文字列は、空の文字列 "" と等しくなります。かなり論理的です。
C# では、これが仕様で反応するように指示されている方法です。
等しいためには、値が空の文字列 (Empty) であるか、この同じインスタンスへの参照であるか、このインスタンスの先頭と一致している必要があります。
「abcd」.StartsWith(「」) が true を返すのはなぜですか?
本当の答え:
そうでなければ、次のような場合があります
"".startsWith("") == false
"".equals("") == true
but yet
"a".startsWith("a") == true
"a".equals("a") == true
そして、2000 年問題が再び発生するでしょう。なぜなら、それ自体から始まる等しい文字列に依存するすべての銀行ソフトウェアが私たちの口座を混同し、突然ビル ゲイツが私の富を手に入れ、私が彼の財産を手に入れるからです。運命は私にとってそれほど親切ではありません。
2 つの文字列の最初の N 文字は同一です。N は 2 番目の文字列の長さ、つまりゼロです。
記録のために、次のチェックを明示的に行うString.StartsWith()メソッドを内部的に呼び出します。System.Globalization.CultureInfo.IsPrefix()
if (prefix.Length == 0)
{
return true;
}
文字列は「無」で始めるのがよいからです。
正規表現の用語で考えれば、それは理にかなっています。すべての文字列 ("abcd" だけでなく、"" および "sdf\nff" も) は、'starts with empty string' の正規表現を評価すると true を返します。