你是否被C#/.Net的LastIndexOf 和 LastIndexOfAny 雷到過呢?

來源:互聯網
上載者:User

周末了,起得晚。爬起來,洗漱完畢開啟電腦,習慣性的收MAIL,第一封就吸引了我,標題:

老兄,我發現了.NET裡面string.LastIndexOfAny的一個邏輯性錯誤的BUG

我的第一反應: 這位兄弟又joking了 ,開啟本文,一段再簡單不過的代碼:

string str = "+-這是一個綜合使用確定子串位置的C#樣本+-";int iLastPos = str.LastIndexOfAny("+-".ToCharArray(), 0);Console.WriteLine(iLastPos);Console.ReadKey(true);

最後是問我,結果等於多少, 為什麼?

我看了一下,然後就想當然的認為,這也太簡單了,不就是最後一位嘛, str.Length – 1 唄! 不過,為了表示對這位兄弟的尊重,我還是運行了一下這個代碼,顯示的結果,讓我大為surprise: 0

Why?   ,查之!!

LastIndexOfAny
報告在 Unicode 數組中指定的一個或多個字元在此執行個體中的最後一個匹配項的索引位置
Reports the index position of the last occurrence in this instance of one or more characters specified in a Unicode array.

重載1: String.LastIndexOfAny(char[] anyOf)
-------------------------------------------------------------------
參數
anyOf
    Unicode 字元數組,包含一個或多個要尋找的字元。 
    A Unicode character array containing one or more characters to seek.

重載2:String.LastIndexOfAny ( char[] anyOf,  int startIndex)
------------------------------------------------------------------------------------
參數
anyOf
    Unicode 字元數組,包含一個或多個要尋找的字元。 
   A Unicode character array containing one or more characters to seek. 

startIndex
    搜尋起始位置。 
    The search starting position.

重載3: 和2類似,我就略掉了

傳回值
此執行個體中最後一個匹配項的索引位置,在此位置找到 anyOf 中的任一字元;否則,如果未找到 anyOf 中的字元,則為 -1。
The index position of the last occurrence in this instance where any character in anyOf was found; otherwise, -1 if no character in anyOf was found.

備忘

索引編號從零開始。
此方法從此執行個體的 startIndex 字元位置開始,從後向前進行搜尋,直到找到 anyOf 中的一個字元或檢查到第一個字元位置。該搜尋區分大小寫。
Index numbering starts from zero.
This method begins searching at the last character position of this instance and proceeds backward toward the beginning until either a character in anyOf is found or the first character position has been examined. The search is case-sensitive.

我上面加紅的地方,是關鍵點,因為是 求LAST,所以逆向效率高,這是無可厚非的,問題就出在這裡了,逆向搜尋

重載2中,對startIndex 這個參數的說明是

startIndex
    搜尋起始位置。 
    The search starting position

這就是說startIndex 是按正向的順序來表示的,那就一目瞭然了,回到最初的問題:

string str = "+-這是一個綜合使用確定子串位置的C#樣本+-";int iLastPos = str.LastIndexOfAny("+-".ToCharArray(), 0);Console.WriteLine(iLastPos);Console.ReadKey(true);

上面的代碼中, 將 startIndex 設定為 0, 他的本意是搜尋整個字串!

但是因為 LastIndexOfAny 是逆向搜尋的, 結果就成了 從 第一個 字元開始,向左搜尋,結果就是匹配了第一個字元,返回了 0

如果要搜尋整個字串,正確的寫法是

string str = "+-這是一個綜合使用確定子串位置的C#樣本+-";int iLastPos = str.LastIndexOfAny("+-".ToCharArray(), str.Length - 1);Console.WriteLine(iLastPos);Console.ReadKey(true);

 

其實,如果看過 MSDN 上,關於 LastIndexOfAny 的那個sample的話,就一目瞭然了

LastIndexOf 和 LastIndexOfAny 是一樣的邏輯,就不重複了

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.