2008-09-28 31 views

Trả lời

158

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

Đặt theo cách này: định nghĩa "bắt đầu bằng" nào bạn có thể cho rằng điều đó sẽ loại trừ điều này? Dưới đây là định nghĩa đơn giản về "bắt đầu bằng" không:

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

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

"x bắt đầu với 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) nếu và chỉ khi y.Length> 0 –

+7

Yup, bạn thực sự có thể loại trừ hoàn toàn trường hợp này. Đó là một định nghĩa khá không rõ ràng, phải không? –

+2

Jon, về cơ bản câu lệnh của bạn yêu cầu "y.Length <= x.Length &&" hoặc nó sẽ ném một IndexOutOfRangeException;) –

17

Phương pháp 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 (Trống), tham chiếu đến cùng một cá thể này hoặc khớp với phần đầu của cá thể này.

.NET String.StartsWith

true nếu chuỗi ký tự đại diện bởi các đối số là một tiền tố của dãy ký tự đạ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 String này được xác định bằng phương thức equals (Object).

Java String.startsWith

4

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

7

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

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

1

Vì chuỗi bắt đầu bằng "không có gì".

+0

... đó là nếu string.empty là không có gì! Việc đơ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 tôi làm theo các cuộc thảo luận theo định hướng lý thuyết tập hợp hơn. –

1

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

45

Tôi sẽ cố gắng giải thích chi tiết về những gì Jon Skeet đã nói.

Hãy nói rằng x, y và z là chuỗi và + nhà điều hành là trong thực tế nối, sau đó:

Nếu chúng ta có thể chia z để viết z = x + y đó có nghĩa là z bắt đầu với x. Bởi vì mỗi chuỗi z có thể được chia thành z = "" + z nó theo sau mỗi chuỗi bắt đầu bằng "".

Vì vậy, bởi vì ("" + "abcd") == "abcd" nó sau đó "abcd" bắt đầu với ""

+32

làm thế nào bạn có thể xây dựng trên Jon Skeet? – devSolo

+2

Vâng, bạn đã đúng. "phức tạp - Để thể hiện ở độ dài lớn hơn hoặc chi tiết hơn". Tôi đã không thêm nhiều (nếu có) vào những gì Jon nói. Đó là tiếng Anh của tôi, tôi cho là vậy. Hoặc tôi không đủ khiêm tốn ;-) –

+0

Tôi vừa mới làm một trò đùa Jon Skeet. Tôi xin lỗi vì đã gây ra sự nhầm lẫn. – devSolo

11

Hãy chỉ nói "abcd".StartsWith("") lợi nhuận sai.

nếu như vậy thì những gì hiện các biểu thức sau đây eval để, đúng hay sai:

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

nó chỉ ra rằng evals là true, vì vậy chuỗi không bắt đầu với chuỗi rỗng ;-), hoặc đưa vào các từ khác, chuỗi con của "abcd" bắt đầu từ vị trí 0 và có độ dài bằng 0 với chuỗi rỗng "". Khá hợp lý imo.

17

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

Tập trống là tập con của mỗi bộ.

Tại sao? definition của tập hợp con nói rằng A là một tập con của B nếu mọi phần tử của A là một phần tử của B. Ngược lại, A không phải là một tập con của B nếu có một phần tử của A không phải là một phần tử của B.

Bây giờ, hãy sửa một bộ B. Tôi sẽ thiết lập rằng bộ trống là một tập con của B. Tôi sẽ làm điều này bằng cách cho thấy rằng không phải là trường hợp tập hợp trống không phải là tập con của B. Nếu tập rỗng không phải là tập hợp con của B thì tôi có thể tìm thấy phần tử của tập trống không nằm trong số B. Nhưng tậ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 phần tử không có trong số B. Do đó, không phải là trường hợp tập hợp rỗng không phải là tập con của B. Do đó, bộ trống phải là một tập con của B.

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

Trước tiên, chúng tôi phải đồng ý với định nghĩa của chúng tôi là bắt đầu bằng. Hãy st được string s Chúng ta nói rằng sbắt đầu vớit nếu s.Length >= t.Lengtht.Length ký tự đầu tiên của trận đấu t những s. Tức là, s.Length >= t.Length và cứ mỗi Int32 index sao cho 0 <= index < t.Length, s[index] == t[index] là đúng sự thật. Ngược lại, chúng ta sẽ nói rằng s không bắt đầu bằng t nếu tuyên bố

s.Length < t.Length hoặc s.Length >= t.Length và có một Int32 index0 <= index < t.Lengths[index] != t[index]

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

Hãy sửa một chuỗi s. Tôi sẽ thiết lập rằng s bắt đầu bằng chuỗi rỗng. 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 mà s không bắt đầu bằng chuỗi rỗng. Nếu s không bắt đầu bằng chuỗi trống thì s.Length < String.Empty.Length hoặc s.Length >= String.Empty.Length và có Int32 index sao cho 0 <= index < String.Empty.Length. Nhưng s.Length >= 0String.Empty.Length bằng 0 vì vậy không thể cho s.Length < String.Empty.Length là đúng. Tương tự, kể từ `` String.Empty.Chiều dài is equal to zero, there is no Chỉ số Int32 = chỉ số < String.Empty.Length`. Do đó

s.Length < String.Empty.Length hoặc s.Length >= String.Empty.Length và có một Int32 index0 <= index < String.Empty.Length

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

Sau đây là triển khai bắt đầu bằng được mã hóa dưới dạng tiện ích mở rộng thành 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 sự kiện được tô đậm ở trên là ví dụ về vacuously true statements. Chúng đúng với thực tế là các tuyên bố xác định chúng (tập hợp conbắt đầu bằng) là universal quantifications trên các vũ trụ trống. Không có phần tử nào trong tập rỗng, vì vậy không thể có bất kỳ phần tử nào của tậ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 rỗng, vì vậy không thể có ký tự như một số vị trí trong chuỗi rỗng không khớp với ký tự ở cùng vị trí trong một số chuỗi cố định khác.

4

Chỉ cần cho các hồ sơ, String.StartsWith() nội bộ gọi phương thức System.Globalization.CultureInfo.IsPrefix() mà làm cho việc kiểm tra sau một cách rõ ràng:

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

Tại sao “abcd” .StartsWith (“”) trả về đúng không?

THE REAL ĐÁP:

Nó có phải như vậy nếu không bạn sẽ phải trường hợp

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

    but yet 

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

và sau đó chúng tôi sẽ phải Y2K khắp nơi trên một lần nữa bởi vì tất cả các ngân hàng phần mềm mà phụ thuộc vào các chuỗi bằng nhau bắt đầu với chính họ sẽ nhận được tài khoản của chúng tôi trộn lẫn và đột nhiên Bill Gates sẽ có sự giàu có của tôi và tôi muốn có của mình, và damn nó! Số phận chỉ là không tốt với tôi.

0

Trong C#, lý do nó trả về true là các nhà phát triển được mã hóa riêng cho nó.

Nếu bạn kiểm tra source code, bạn sẽ tìm thấy logic cụ thể để xử lý một chuỗi rỗng:

public Boolean StartsWith(String value) 
{ 
    return StartsWith(value, StringComparison.CurrentCulture); 
} 

public Boolean StartsWith(String value, StringComparison comparisonType) 
{ 
    ... 

    if (value.Length == 0) 
    { 
     return true; 
    } 
Các vấn đề liên quan