Tại sao “abcd” .StartsWith (“”) trả về true?


87

Tiêu đề là toàn bộ câu hỏi. Ai đó có thể cho tôi một lý do tại sao điều này xảy ra?

Câu trả lời:


164

Có - bởi vì nó bắt đầu bằng chuỗi trống. Thật vậy, chuỗi rỗng xảy ra một cách hợp lý giữa mọi cặp ký tự.

Hãy giải thích theo cách này: bạn có thể đưa ra định nghĩa nào về "bắt đầu bằng" có thể loại trừ điều này? Đây là một định nghĩa đơn giản về "bắt đầu với" không:

"x bắt đầu bằng y nếu các y.Lengthký tự đầu tiên của x khớp với các ký tự của y."

Một định nghĩa thay thế (tương đương):

"x bắt đầu bằng y nếu x.Substring(0, y.Length).Equals(y)"


3
x bắt đầu với y nếu x.Substring (0, y.Length) Equals (y) khi và chỉ khi y.Length> 0
Vinko Vrsalovic

8
Đúng, bạn thực sự có thể loại trừ trường hợp này một cách rõ ràng. Đó là một định nghĩa khá thiếu nhã nhặn, phải không?
Jon Skeet

7
Thật. Nó cũng đòi hỏi họ phải là không null, quá ... nhưng tôi muốn nói rằng cả hai add để tính chính xác khi lấy đi từ tinh thần của định nghĩa đơn giản :)
Jon Skeet

8
Số lần xuất hiện vô hạn của chuỗi trống xảy ra giữa mọi cặp ký tự.
Lotus Notes

3
Vâng, nó giống như đặt một số 0 trước một số - Nó không thay đổi giá trị nhưng nó vẫn tồn tại.
pop850

47

Tôi sẽ cố gắng giải thích kỹ hơn những gì Jon Skeet đã nói.

Giả sử x, y và z là các chuỗi và toán tử + trên thực tế là phép nối, khi đó:

Nếu chúng ta có thể tách z để viết z = x + y có nghĩa là z bắt đầu bằng x. Vì mọi chuỗi z có thể được chia thành z = "" + z nên mọi chuỗi đều bắt đầu bằng "".

Vì vậy, bởi vì ("" + "abcd") == "abcd" nên "abcd" bắt đầu bằng ""


17

Phương thức này so sánh tham số giá trị với chuỗi con ở đầu chuỗi này có cùng độ dài với giá trị và trả về giá trị cho biết chúng có bằng nhau hay không. Để bằng nhau, giá trị phải là một chuỗi rỗng (Empty), một tham chiếu đến cùng một phiên bản này hoặc khớp với phần đầu của phiên bản này.

.NET String.StartsWith

true nếu chuỗi ký tự được đại diện bởi đối số là tiền tố của chuỗi ký tự được đại diện bởi chuỗi này; sai khác. Cũng lưu ý rằng true sẽ được trả về nếu đối số là một chuỗi rỗng hoặc bằng đối tượng Chuỗi này được xác định bởi phương thức equals (Object).

Java String.startsWith


17

Tôi sẽ bắt đầu với một thực tế liên quan dễ hiểu hơn.

Tập hợp rỗng là tập hợp con của mọi tập hợp.

Tại sao? Các định nghĩa của tập hợp con các quốc gia mà Alà một tập hợp con của Bnếu mọi phần tử của Amột yếu tố B. Ngược lại, Akhông phải là một tập hợp con của Bnếu có một phần tử của Anó không phải là một phần tử của B.

Bây giờ sửa một tập hợp B. Tôi sẽ thiết lập rằng tập hợp trống là tập hợp con của B. Tôi sẽ làm điều này bằng cách chỉ ra rằng không phải là trường hợp tập hợp rỗng không phải là tập hợp con của B. Nếu tập hợp trống không phải là một tập hợp con Bthì tôi có thể tìm thấy một phần tử của tập hợp trống không có trong đó B. Nhưng tập hợp rỗng không có bất kỳ phần tử nào và do đó tôi không thể tìm thấy một phần tử không có trong đó B. Do đó, không có trường hợp nào tập rỗng không phải là tập con của B. Do đó, tập hợp rỗng phải là tập hợp con của B.

Bất kỳ chuỗi nào bắt đầu bằng chuỗi rỗng.

Đầu tiên, chúng ta phải đồng ý về định nghĩa của chúng ta về start with . Let sand tbe strings Chúng tôi nói rằng s bắt đầu bằng t if s.Length >= t.Lengthvà các t.Lengthký tự đầu tiên của tkhớp với các ký tự của s. Đó là, s.Length >= t.Lengthvà đối với mọi Int32 indexđiều đó 0 <= index < t.Length, s[index] == t[index]đều đúng. Ngược lại, chúng tôi sẽ nói rằng điều sđó không bắt đầu bằng tcâu lệnh if

s.Length < t.Lengthhoặc s.Length >= t.Lengthvà có một thứ Int32 indexnhư vậy 0 <= index < t.Lengths[index] != t[index]

là đúng. Trong tiếng Anh đơn giản, sngắn hơn t, hoặc, nếu không, có một ký tự tkhông khớp với ký tự như cùng một vị trí trong s.

Bây giờ sửa một chuỗi s. Tôi sẽ thiết lập điều đó sbắt đầu với chuỗi trống. Tôi sẽ làm điều này bằng cách chỉ ra rằng nó không phải là trường hợp skhông bắt đầu bằng chuỗi trống. Nếu skhông bắt đầu bằng chuỗi trống thì s.Length < String.Empty.Lengthhoặc s.Length >= String.Empty.Lengthvà có một chuỗi Int32 indexnhư vậy 0 <= index < String.Empty.Length. Nhưng s.Length >= 0String.Empty.Lengthbằng 0 nên không s.Length < String.Empty.Lengththể đúng. Tương tự, vì `` String.Empty.Length is equal to zero, there is noInt32 index satisfying0 <= index <String.Empty.Length`. vì thế

s.Length < String.Empty.Lengthhoặc s.Length >= String.Empty.Lengthvà có một thứ Int32 indexnhư vậy0 <= index < String.Empty.Length

là sai. Do đó, nó không phải là trường hợp skhông bắt đầu với chuỗi rỗng. Do đó, sphải bắt đầu bằng chuỗi trống.

Sau đây là một triển khai của bắt đầu với mã hóa là một phần mở rộng cho 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;
}

Hai dữ kiện được in đậm ở trên là những ví dụ về các tuyên bố hoàn toàn đúng . Chúng đúng bởi thực tế là các phát biểu xác định chúng ( tập hợp conbắt đầu bằng ) là các định lượng phổ quát đối với các vũ trụ trống. Không có phần tử nào trong tập hợp rỗng, vì vậy không thể có bất kỳ phần tử nào của tập hợp rỗng không nằm trong một số tập hợp cố định khác. Không có ký tự nào trong chuỗi trống, vì vậy không thể có ký tự vì một số vị trí trong chuỗi trống không khớp với ký tự ở cùng vị trí trong một số chuỗi cố định khác.


13

Hãy chỉ nói rằng "abcd".StartsWith("")trả về false.

nếu vậy thì biểu thức sau đánh giá là gì, đúng hay sai:

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

nó chỉ ra là true, vì vậy chuỗi bắt đầu bằng chuỗi trống ;-), hay nói cách khác, chuỗi con của "abcd" bắt đầu từ vị trí 0 và có độ dài 0 bằng chuỗi trống "". Imo khá logic.


Thực tế là "abcd" .Substring (0, 0) trả về một chuỗi trống không có nghĩa là "abcd" thực sự bắt đầu bằng một chuỗi trống. Kết quả cũng có thể được khai báo là 'không xác định', như nullmột giá trị trả về thích hợp như nhau.
Tom Lint

@TomLint Không. Bạn thường kết hợp các điều kiện IE x.FirstName.StartsWith (userEnteredFirstName) && x.LastName.StartsWith (userEnteredLastName) .... Điều này làm cho điều kiện hoạt động ngay cả khi một trong các valeus đã nhập là chuỗi trống.
Pop Catalin

7

Trong C #, đây là cách đặc tả yêu cầu nó phản ứng;

Để bằng nhau, giá trị phải là một chuỗi rỗng (Empty), một tham chiếu đến cùng một phiên bản này hoặc khớp với phần đầu của phiên bản này.


5

N ký tự đầu tiên của hai chuỗi giống hệt nhau. N là độ dài của chuỗi thứ hai, tức là số không.


5

Tại sao “abcd” .StartsWith (“”) trả về true?

CÂU TRẢ LỜI THỰC TẾ:

Nó phải theo cách đó nếu không bạn sẽ gặp trường hợp

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

    but yet

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

và sau đó chúng ta lại có Y2K vì tất cả các phần mềm ngân hàng phụ thuộc vào các chuỗi bằng nhau bắt đầu với chính chúng sẽ khiến tài khoản của chúng ta bị trộn lẫn và đột nhiên Bill Gates sẽ có tài sản của tôi và tôi có của anh ấy, và chết tiệt! Số phận không tốt với tôi.


Tôi không đồng ý. "" .startsWith ("") phải bằng true, bởi vì các chuỗi giống hệt nhau và không phải do một số logic nghiệp vụ kỳ lạ.
Tom Lint

@TomLint Trên thực tế, bạn đồng ý với khẳng định trong câu trả lời ...
neonblitzer

4

Chỉ đối với bản ghi, String.StartsWith()gọi nội bộ phương thức System.Globalization.CultureInfo.IsPrefix()thực hiện kiểm tra rõ ràng sau:

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

1

Bởi vì một chuỗi bắt đầu tốt bằng "nothing".


1
... đó là nếu string.empty không là gì! Sự đơn giản hóa quá mức này không thể được khái quát hóa. Tôi đề nghị chúng ta nên theo dõi các cuộc thảo luận theo định hướng lý thuyết tập hợp hơn.
Pita.O

1

Nếu bạn nghĩ về nó trong thuật ngữ biểu thức chính quy, nó có ý nghĩa. Mọi chuỗi (không chỉ "abcd", cả "" và "sdf \ nff"), đều trả về true khi đánh giá biểu thức chính quy của 'bắt đầu bằng chuỗi rỗng'.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.