IComparer example, with numbers first, and empty strings at the end:
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
namespace IComparer
{
class Program
{
public class myCaseInsensitiveComparer : IComparer
{
public int Compare(string x, string y)
{
bool isXnumeric = int.TryParse(x, out var xInt);
bool isYnumeric = int.TryParse(y, out var yInt);
if (string.IsNullOrWhiteSpace(x) && string.IsNullOrWhiteSpace(y))
{
return 0;
}
if (string.IsNullOrWhiteSpace(x))
{
return 1;
}
if (string.IsNullOrWhiteSpace(y))
{
return -1;
}
if (isXnumeric && isYnumeric)
{
return xInt.CompareTo(yInt);
}
return string.Compare(x, y, StringComparison.OrdinalIgnoreCase);
}
}
static void Main(string[] args)
{
string[] words = { "1", "a", "A", "", "b", "", "B", "C", "c", "", "", "3" };
IOrderedEnumerable sortedWords = words.OrderBy(a => a, new myCaseInsensitiveComparer());
foreach (var sortedWord in sortedWords)
{
Console.WriteLine(sortedWord);
}
Console.WriteLine("Press any key...");
Console.ReadKey();
}
}
}
Result should be something like:

Source you can download from here.