4

文字だけで数字を含む文字列配列を並べ替えようとしています。たとえば、次のようになります。

Original array = {"09Bananas", "Pears2", "Mangoes39Bad", "100Apples", "Mangoes38Good"}

次のようになります。

Sorted array = {"100Apples", "09Bananas", "Mangoes39Bad", "Mangoes38Good", "Pears2"}

ただし、使用しようとすると、Array.sort(original)次のようになります。

{"09Bananas", "100Apples", "Mangoes38Good", "Mangoes39Bad", "Pears2"}

Array.sort数字を無視するような過負荷はありますか?

ありがとう

4

2 に答える 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()は、文字列を個々の文字の配列に変換します。

于 2012-07-25T12:13:13.100 に答える
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)));
于 2012-07-25T12:19:04.450 に答える