“abcd”.StartsWith(“”) が true を返すのはなぜですか?
-
02-07-2019 - |
質問
タイトルが質問全体です。誰かがこれが起こる理由を教えてくれますか?
解決
はい - 空の文字列で始まるためです。実際、空の文字列は論理的に文字の各ペアの間に発生します。
このように言います:これを排除する「で始まる」の定義を教えてください。以下に、そうでない「で始まる」の簡単な定義を示します。
「最初の場合、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すべての文字列が""で始まることになります。
したがって、("" +&ab; abcd")==&ab; abcd" " abcd" ""で始まる
このメソッドは、valueパラメーターを、この文字列の先頭にあるvalueと同じ長さの部分文字列と比較し、等しいかどうかを示す値を返します。 等しくするには、値は空の文字列(空)、この同じインスタンスへの参照、またはこのインスタンスの先頭に一致する必要があります。
引数で表される文字シーケンスがこの文字列で表される文字シーケンスのプレフィックスである場合、true。そうでない場合はfalse。 引数が空の文字列である場合、またはequals(Object)メソッドで決定されたこのStringオブジェクトと等しい場合はtrueが返されることにも注意してください。
理解しやすい関連する事実から始めます。
空のセットはすべてのセットのサブセットです。
なぜですか? サブセットの定義には、 A
A
のすべての要素が B
の要素である場合、 B
のサブセットです。逆に、 B
の要素ではない A
の要素がある場合、 A
は B
のサブセットではありません>。
セット B
を修正しました。空のセットが B
のサブセットであることを確認します。これを行うには、空のセットが B
のサブセットではないことを示します。空のセットが B
のサブセットではない場合、 B
にない空のセットの要素を見つけることができました。しかし、空のセットには要素が含まれていないため、 B
にない要素は見つかりません。したがって、空のセットが B
のサブセットではないということはありません。したがって、空のセットは B
のサブセットである必要があります。
すべての文字列は空の文字列で始まります。
最初に、で始まるの定義に同意する必要があります。 s
および t
を string
sとする s
starts with t
s.Length> = t.Length
および t
の最初の t.Length
文字が< code> s 。つまり、 s.Length&gt; = t.Length
で、 0&lt; = index&lt;となるすべての
、 Int32インデックス
t.Length s [index] == t [index]
はtrueです。逆に、ステートメント
s
は t
で始まらないと言います。
s.Length&lt; t.Length
または s.Length&gt; = t.Length
で、 0&lt; = index&lt;のような
および Int32インデックス
があります。 t.Length s [index]!= t [index]
はtrueです。簡単な英語では、 s
は t
より短いか、そうでない場合は t
に同じ位置の文字と一致しない文字があります s
で。
文字列 s
を修正しました。 s
が空の文字列で始まることを確認します。これを行うには、 s
が空の文字列で始まっていない場合ではないことを示します。 s
が空の文字列で始まっていない場合、 s.Length&lt; String.Empty.Length
または s.Length&gt; = String.Empty.Length
および 0&lt; =のような
。ただし、 Int32インデックス
がありますインデックス&lt; String.Empty.Length s.Length&gt; = 0
および String.Empty.Length
はゼロに等しいため、 s.Length&lt;は不可能です。 String.Empty.Length
がtrueになります。同様に、「String.Empty.Length はゼロに等しいため、Int32 index
satisfying
0&lt; = index&lt; String.Empty.Length`。したがって
s.Length&lt; String.Empty.Length
または s.Length&gt; = String.Empty.Length
および 0&lt; =のような
Int32インデックス
がありますインデックス&lt; String.Empty.Length
は偽です。したがって、 s
が空の文字列で始まっていないわけではありません。したがって、 s
は空の文字列で始まる必要があります。
以下は、 string
の拡張としてコーディングされた starts の実装です。
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つの太字の事実は、虚偽の真実の例です。それらは、それらを定義するステートメント(サブセットおよびで始まる)が空のユニバースに対するユニバーサル数量化。がある
&quot; abcd&quot; .StartsWith(&quot;&quot;)
はfalseを返します。
その場合、次の式の評価はtrueまたはfalseになります:
("abcd".Substring(0,0) == "")
evalsがtrueであることが判明したため、文字列は空の文字列で始まります;-)、つまり、「abcd」の部分文字列を入力します。位置0から始まり、長さが0の場合、空の文字列&quot;&quot;と等しくなります。かなり論理的です。
C#では、これは仕様が反応するように指示する方法です。
等しくするには、値は空の文字列(空)、この同じインスタンスへの参照、またはこのインスタンスの先頭に一致する必要があります。
&#8220; abcd&#8221; .StartsWith(&#8220;&#8221;)がtrueを返すのはなぜですか?
実際の回答:
そのようにする必要があります。そうしないと、
"".startsWith("") == false
"".equals("") == true
but yet
"a".startsWith("a") == true
"a".equals("a") == true
その後、Y2Kが再び発生します。それは、同じ文字列に依存する銀行ソフトウェアがすべて自分自身で始まるため、アカウントが混乱し、ビルゲイツが突然私の富を手にし、私は彼を持っているからです!運命は私にはそれほど親切ではありません。
2つの文字列の最初のN文字は同じです。 Nは2番目の文字列の長さ、つまりゼロです。
レコードの場合、 String.StartsWith()
は、次のチェックを明示的に行うメソッド System.Globalization.CultureInfo.IsPrefix()
を内部的に呼び出します。
if (prefix.Length == 0)
{
return true;
}
文字列は&quot; nothing&quot;で始まるため。
正規表現で考えるなら、それは理にかなっています。 すべての文字列(&quot; abcd&quot;だけでなく、&quot;&quot;および&quot; sdf \ nff&quot;)、 「空の文字列で始まる」の正規表現を評価するときにtrueを返します。
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;
}