2012-09-14 42 views
36

không ai biết lý do tại sao:string.LastIndexOf() Lỗi?

" <exception>".LastIndexOf("<",0) returns -1 (wrong) 

khi

" <exception>".LastIndexOf("<") returns 2 (right) 

"<exception>".LastIndexOf("<",0) returns 0 (right) 

Đây có phải là một lỗi hay tôi hiểu lầm các LastIndexOf-Phương pháp?

Trả lời

70

Bạn hiểu lầm rằng quá tải cụ thể của phương pháp LastIndexOf.

Các docs nhà nước như sau:

Các tìm kiếm bắt đầu ở vị trí nhân vật cụ thể và tiến hành ngược về phía đầu của chuỗi.

Lưu ý rằng nó nói backward. Vì vậy, nếu bạn bắt đầu ở vị trí 0, không có "<" chuỗi con tại vị trí đó hoặc trước vị trí đó và do đó kết quả là -1.

Ngược lại, nếu bạn sử dụng quá tải chỉ nhận chuỗi con, tìm kiếm sẽ bắt đầu ở cuối chuỗi và do đó tìm chính xác chuỗi con được chỉ định.

+1

Ah ok cảm ơn bạn rất nhiều. Tôi chỉ đọc mô tả trong menu intellisense, vì vậy tôi không biết rằng nó tiến hành ngược. ;) –

+1

một câu hỏi thú vị hơn, imo, là lý do tại sao những người chọn thực hiện nó theo cách này. –

+0

@ antony.trupe theo cách này bạn có thể dừng lại sau khi bạn tìm thấy trường hợp đầu tiên. – soandos

22

Các quá tải string, int32 của LastIndexOf nói, in the description "Bản báo cáo vị trí chỉ số zero-dựa trên sự xuất hiện cuối cùng của một ký tự Unicode theo quy định trong trường hợp này. Việc tìm kiếm bắt đầu từ một vị trí nhân vật cụ thể và tiến hành ngược về phía đầu chuỗi. "

Vì vậy, nếu bạn vượt qua trong 0, nó sẽ chỉ kiểm tra ký tự đầu tiên, không kiểm tra toàn bộ chuỗi từ0.

4

Đó là vì thông số thứ hai cho biết rằng thông số sẽ bắt đầu ở vị trí 0 và nhìn từ đó và về phía đầu chuỗi.

Bạn sẽ chỉ tìm chuỗi nếu nó là vào lúc bắt đầu của chuỗi, và chỉ khi bạn đang tìm kiếm một chuỗi đó là một ký tự dài:

"<exception>".LastIndexOf("<",0) // returns 0 

"<exception>".LastIndexOf("<ex",0) // returns -1 
5

Tôi nghĩ rằng bạn đang missunderstanding phương pháp .

Tham số thứ hai là ký tự mà bạn bắt đầu tìm kiếm. Nếu bạn tìm kiếm ngược từ ký tự ở vị trí 0 ... kết quả là đúng.

10

Tham số thứ hai không làm những gì bạn dường như nghĩ nó:

LastIndex(char value, int startIndex) 

các startIndex là char để bắt đầu tìm kiếm ngược qua chuỗi, vì vậy nếu bạn vượt qua một 0 thì chỉ là người đầu tiên char được kiểm tra ...

Để kiểm tra toàn bộ chuỗi từ cuối, bạn sẽ phải vượt qua độ dài của chuỗi -1.

thấy MSDN String.LastIndex

3

Đó là OK sự biểu hiện đầu tiên tìm thấy biểu tượng < từ phần tử 0 của chuỗi để bắt đầu e. g. không tìm thấy simbol như vậy; tìm kiếm thứ hai thông qua toàn bộ chuỗi và tìm ở vị trí 2 và tìm kiếm cuối cùng từ 0 simbol bằng < và trả về vị trí 0.

MSDN) link

9

Các tài liệu (http://msdn.microsoft.com/en-us/library/bc3z4t9d.aspx#Y0) nói:

Các tìm kiếm bắt đầu ở vị trí nhân vật startIndex của trường hợp này và tiền ngược về phía đầu cho đến khi một trong hai giá trị được tìm thấy hoặc vị trí ký tự đầu tiên đã được kiểm tra. Đối với ví dụ , nếu startIndex là Độ dài - 1, phương pháp sẽ tìm kiếm mỗi ký tự từ ký tự cuối cùng trong chuỗi đến đầu.

(nhấn mạnh của tôi)

Vì vậy, đây:

" <exception>".LastIndexOf("<",0) 

được bắt đầu từ 0 và làm việc trở về trước, và do đó việc tìm kiếm một cách chính xác không có kết quả và trả về -1.

Tôi nghĩ rằng sự nhầm lẫn là LastIndexOf đếm ngược, trong đó IndexOf đếm ngược.

5

Đó là một sai lầm, bởi vì LastIndexOf **() ** tìm kiếm lạc hậu từ vị trí đã chỉ định.

Hãy thử mã này:

" <exception>".LastIndexOf("<", 5) 

Hy vọng nó rất hữu ích

3
  • haystack.LastIndexOf("needle") tìm kiếm một chuỗi cho sự xuất hiện cuối cùng của một "cây kim" -string.

  • Phương thức LastIndexOfIndexOf trả về -1 nếu giá trị tìm kiếm không bao giờ xảy ra.

  • LastIndexOf tìm kiếm từ < --right sang trái, trong khi

  • IndexOf tìm kiếm từ -bên trái bên phải ->

    • Các chỉ số nhân vật của chuỗi bắt đầu tại 0 và tăng từ trái sang phải

    • Cả hai phương pháp giả định một offset-index của 0 khi không có tham số thứ hai được cung cấp

  • Chức năng cũng tồn tại trong JavaScript như lastIndexOf

    • (Lưu ý: các mixedcase hoặc Camelback-vỏ) và thiết lập một chỉ số bên ngoài giới hạn của chiều dài của chuỗi hay là OK trong JavaScript, nhưng trong C# nó sẽ dẫn đến một ngoại lệ System.ArgumentOutOfRangeException: < 0 || > this.Length.

Ví dụ:

" <exception>".LastIndexOf("<", 3) 
//> returns 2 
" <exception>".LastIndexOf("<", " <exception>".Length) 
//> returns 2 
" <exception>".LastIndexOf("<", " <exception>".Length+1) 
//> ArgumentOutOfRangeException 
" <exception>".LastIndexOf("<", 2) 
//> returns 2 
" <exception>".LastIndexOf("<", -1) 
//> returns -1 
" <exception>".LastIndexOf("<", -2) 
//> ArgumentOutOfRangeException 
" <exception>".LastIndexOf("<", 1) 
//> returns -1 

Vì trong trường hợp cuối cùng không có chuỗi hoặc nhân vật < tồn tại trong khoảng thời gian nhân vật của haystring của 0-1, -1 được trả lại một cách chính xác.