我正在尝试对包含数字的字符串数组进行排序,例如:
Original array = {"09Bananas", "Pears2", "Mangoes39Bad", "100Apples", "Mangoes38Good"}
应该成为:
Sorted array = {"100Apples", "09Bananas", "Mangoes39Bad", "Mangoes38Good", "Pears2"}
然而,当我尝试使用Array.sort(original)
时,它会像这样出现:
{"09Bananas", "100Apples", "Mangoes38Good", "Mangoes39Bad", "Pears2"}
是否存在Array.sort
的重载会使其忽略数字?
由于
答案 0 :(得分:6)
使用Array.Sort<T>(T[],IComparer<T>)
重载,并在比较字符串之前跳过数字。
var array = new[] {
"09Bananas", "Pears2", "Mangoes39Bad", "100Apples", "Mangoes38Good"
};
Array.Sort(array, (a,b) => {
a = new string(a.Where(char.IsLetter).ToArray());
b = new string(b.Where(char.IsLetter).ToArray());
return a.CompareTo(b);
});
Console.WriteLine(string.Join(", ", array));
LINQ表达式a.Where(char.IsLetter).ToArray()
将字符串转换为单个字母数组。
答案 1 :(得分:3)
您可以编写一个返回不带数字的字符串的方法,并将其与Enumerable.OrderBy
:
private string TextOnly(String input)
{
StringBuilder sb = new StringBuilder();
foreach (Char c in input)
if (!Char.IsDigit(c))
sb.Append(c);
return sb.ToString();
}
使用它:
var original = new[] { "09Bananas", "Pears2", "Mangoes39Bad", "100Apples", "Mangoes38Good" };
var ordered = original.OrderBy(s => TextOnly(s));
// if you need it as: String[] orderedArray = ordered.ToArray();
要订购原始数组,您可以使用Array<T>.Sort
,如@dasblinkenlight所述:
Array.Sort<String>(original, (s1, s2) => TextOnly(s1).CompareTo(TextOnly(s2)));