Sort string array in alphabetical order of ignoring numbers and characters

I am trying to sort a string array that contains numbers by letters, for example, for example:

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

It should become:

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

However, when I try to use Array.sort(original) , it will look like this:

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

Is there an Array.sort overload that will force it to ignore numbers?

thanks

+4
source share
2 answers

Use Array.Sort<T>(T[],IComparer<T>) overload and skip the numbers before comparing strings.

 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 expression a.Where(char.IsLetter).ToArray() converts a string into an array of individual letters.

+6
source

You can write a method that returns a string without numbers, and use it with 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(); } 

use it:

 var original = new[] { "09Bananas", "Pears2", "Mangoes39Bad", "100Apples", "Mangoes38Good" }; var ordered = original.OrderBy(s => TextOnly(s)); // if you need it as: String[] orderedArray = ordered.ToArray(); 

To order the source array, you can use Array<T>.Sort , as @dasblinkenlight noted:

 Array.Sort<String>(original, (s1, s2) => TextOnly(s1).CompareTo(TextOnly(s2))); 
+3
source

All Articles