周末了,起得晚。爬起來,洗漱完畢開啟電腦,習慣性的收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 是一樣的邏輯,就不重複了