当前位置:  开发笔记 > 编程语言 > 正文

为什么"abcd".StartsWith("")返回true?

如何解决《为什么"abcd".StartsWith("")返回true?》经验,为你挑选了6个好方法。

标题是整个问题.有人能告诉我为什么会这样吗?



1> Jon Skeet..:

是的 - 因为它确实以空字符串开头.实际上,空字符串逻辑上发生在每对字符之间.

这样说:你可以给出什么样的"以...开头"的定义会排除这种情况?以下是"以...开头"的简单定义:

"如果x的第一个y.Length字符与y 匹配,则x 以y开头."

另一种(等效的)定义:

"如果是,则以y开头x.Substring(0, y.Length).Equals(y)"


是的,你确实可以明确地排除这种情况.这是一个非常不优雅的定义,不是吗?
真正.它也要求它们也是非空的......但是我会说这两个都增加了准确性,同时取消了简单定义的*精神*:)
在每对字符之间出现无限次出现的空字符串.
如果x.Substring(0,y.Length).Equals(y)当且仅当y.Length> 0时,x以y开头
@Deepak:究竟是什么的一个例子?
Jon,基本上你的语句需要"y.Length <= x.Length &&"或者它会抛出一个IndexOutOfRangeException;)
是的,这就像在数字前面加零 - 它没有改变价值但它仍然存在.
虽然在集合理论中,一组字符包含空字符集是正确的,但实际上这个概念并不能很好地映射到String类,而且它是更常见的用例.如果字符串以空字符串开头,那么问一个字符串几乎肯定是一个逻辑错误,因此,无论如何,对于startsWith()等,抛出IllegalArgumentException指示不相关性更合适.

2> Petar Repac..:

我将试着详细说明Jon Skeet所说的话.

假设x,y和z是字符串,而+运算符实际上是连接,那么:

如果我们可以将z分割为写z = x + y,这意味着z以x开头.因为每个字符串z都可以拆分为z =""+ z,所以每个字符串都以""开头.

所以,因为(""+"abcd")=="abcd",所以"abcd"以""开头


你怎么能详细说明Jon Skeet?
嗯,你是对的."详细说明 - 更长或更详细地表达".我没有添加太多(如果有的话)Jon说的话.我想这是我的英语.或者我不够谦虚;-)
我记得Egon Spengler谈到了关于Jon Skeet的详细说明,一些关于"以光速爆炸"的事情.

3> Firas Assaad..:

此方法将value参数与此字符串开头的子字符串进行比较,该字符串与value的长度相同,并返回一个值,指示它们是否相等.要相等,value必须是空字符串(Empty),对此同一实例的引用,或者匹配此实例的开头.

.NET String.StartsWith

如果参数表示的字符序列是此字符串表示的字符序列的前缀,则返回true;否则返回false.否则是假的.另请注意,如果参数为空字符串或等于此equals(Object)方法确定的String对象,则返回true.

Java String.startsWith



4> jason..:

我将从一个更容易理解的相关事实开始.

空集是每个集的子集.

为什么?该定义的子集指出A的一个子集B,如果每一个元素A是一个元素B.相反,如果有一个元素不是元素,A则不是它的子集.BAB

现在修一套B.我将确定空集是其中的一个子集B.我将通过显示空集不是其子集的情况来做到这一点B.如果空集不是其中的子集,B那么我可以找到不在的空集的元素B.但是空集没有任何元素,因此我找不到不存在的元素B.因此,不是空集不是其子集的情况B.因此,空集必须是其子集B.

任何字符串都以空字符串开头.

首先,我们必须就我们对起点的定义达成一致.让我们ststring小号我们说s 开头 t,如果s.Length >= t.Length和第一t.Length的字符t匹配的s.也就是说,s.Length >= t.Length并为每个Int32 index这样0 <= index < t.Length,s[index] == t[index]是真实的.相反,我们会说这s不是从t声明开始的

s.Length < t.Length或者s.Length >= t.Length有一个Int32 index这样的0 <= index < t.Lengths[index] != t[index]

是真的.在简单的英语中,s短于t或者,如果没有,则有一个字符t与该字符不匹配的位置相同s.

现在修复一个字符串s.我将建立s以空字符串开头的东西.我将通过显示s不是以空字符串开头的情况来做到这一点.如果s不是以空字符串开头那么s.Length < String.Empty.Length或者s.Length >= String.Empty.LengthInt32 index这样的话0 <= index < String.Empty.Length.但是s.Length >= 0并且String.Empty.Length等于零,因此不可能s.Length < String.Empty.Length成为现实.同样,因为``String.Empty.Length is equal to zero, there is noInt32索引satisfying0 <= index

s.Length < String.Empty.Length或者s.Length >= String.Empty.LengthInt32 index这样的0 <= index < String.Empty.Length

是假的.因此,s不是以空字符串开头的情况.因此,s必须以空字符串开头.

以下是一个开头的实现,编码为扩展名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;
}

以上两个粗体事实是空洞真实陈述的例子.它们是真实的,因为定义它们的语句(子集开头)是空宇宙的通用量化.空集中没有元素,因此空集中的任何元素都不能存在于其他固定集中.空字符串中没有字符,因此不能有字符作为空字符串中的某个位置与其他固定字符串中相同位置的字符不匹配.



5> Pop Catalin..:

我们只是说"abcd".StartsWith("")返回false.

若是,则以下表达式eval为,true或false:

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

事实证明,evals为true,所以字符串确实以空字符串开头;-),换句话说,"abcd"的子字符串从位置0开始,0长度等于空字符串"".相当合乎逻辑的imo.



6> blowdart..:

在C#中,这是规范告诉它做出反应的方式;

要相等,value必须是空字符串(Empty),对此同一实例的引用,或者匹配此实例的开头.

推荐阅读
爱唱歌的郭少文_
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有