在對字串陣列中的數值進行優先排序的同時保持字母順序
按字母順序對字串進行排序是一項標準任務,但是如何處理字串的場景在保持數字順序的同時也表示數字?這是解決此挑戰的解決方案。
請考慮以下程式碼:
string[] things= new string[] { "105", "101", "102", "103", "90" }; foreach (var thing in things.OrderBy(x => x)) { Console.WriteLine(thing); }
此程式碼嘗試以字母順序對數字字串陣列進行排序,但輸出不符合預期:
101, 102, 103, 105, 90
要達到預期的輸出:
90, 101, 102, 103, 105
你需要傳遞一個自訂的比較器進入OrderBy。 Enumerable.OrderBy 可讓您指定用於排序的自訂比較器。
這是使用SemiNumericComparer 的實作:
string[] things = new string[] { "paul", "bob", "lauren", "007", "90" }; foreach (var thing in things.OrderBy(x => x, new SemiNumericComparer())) { Console.WriteLine(thing); }
SemiNumericComparer 類別定義了一個方法來決定字串是否為數字,並提供比較方法:
public class SemiNumericComparer: IComparer<string> { /// <summary> /// Method to determine if a string is a number /// </summary> /// <param name="value">String to test</param> /// <returns>True if numeric</returns> public static bool IsNumeric(string value) { return int.TryParse(value, out _); } /// <inheritdoc /> public int Compare(string s1, string s2) { const int S1GreaterThanS2 = 1; const int S2GreaterThanS1 = -1; var IsNumeric1 = IsNumeric(s1); var IsNumeric2 = IsNumeric(s2); if (IsNumeric1 && IsNumeric2) { var i1 = Convert.ToInt32(s1); var i2 = Convert.ToInt32(s2); if (i1 > i2) { return S1GreaterThanS2; } if (i1 < i2) { return S2GreaterThanS1; } return 0; } if (IsNumeric1) { return S2GreaterThanS1; } if (IsNumeric2) { return S1GreaterThanS2; } return string.Compare(s1, s2, true, CultureInfo.InvariantCulture); } }
以上是如何按字母順序對字串陣列進行排序,同時對數值進行優先排序?的詳細內容。更多資訊請關注PHP中文網其他相關文章!