using System.Collections.Generic;
public static void Main()
var numericList = new List<string>{"100", "--", "-0.98", "N/A", "0.00", "-888"};
var stringList = new List<string> {"Smith", "--", "Peter", "", "Jim", "Ken", "NA"};
Console.WriteLine(String.Join(", ", numericList.OrderBy(v => v, new NumberTextComparer())));
Console.WriteLine(String.Join(", ", stringList.OrderBy(v => v, new NumberTextComparer())));
public class NumberTextComparer : IComparer<string>
public int Compare(string s1, string s2)
var isS1Numeric = double.TryParse(s1, out number1);
var isS2Numeric = double.TryParse(s2, out number2);
if (isS1Numeric && isS2Numeric)
if (number1 > number2) return 1;
if (number1 < number2) return -1;
return isS1Numeric ? 1 : (isS2Numeric ? -1 : String.Compare(s1, s2, StringComparison.OrdinalIgnoreCase));