将一个字符串数组按字母顺序排序,忽略数字和符号。

4
我正在尝试通过字母对包含数字的字符串数组进行排序,例如:
原始数组 = {"09Bananas", "Pears2", "Mangoes39Bad", "100Apples", "Mangoes38Good"}
应该变成:
排序后的数组 = {"100Apples", "09Bananas", "Mangoes39Bad", "Mangoes38Good", "Pears2"}
但是当我尝试使用Array.sort(original)时,结果会像这样:
{"09Bananas", "100Apples", "Mangoes38Good", "Mangoes39Bad", "Pears2"}
是否有Array.sort的重载版本可以忽略数字?
谢谢
2个回答

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()将字符串转换为单个字母的数组。

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();

要按照原始数组排序,您可以使用如@dasblinkenlight所提到的Array<T>.Sort
Array.Sort<String>(original, (s1, s2) => TextOnly(s1).CompareTo(TextOnly(s2)));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接