Мне кажется, вы просто пытаетесь расставить приоритеты первым числом в целом числе, а не числом в целом. Если это так, может быть, это будет работать для вас?
var list = new List<int>() { 210, 29, 42, 310, 39, 38, 41, 31 };
var sortedList = list.OrderByDescending(x => x.ToString()[0]).ThenByDescending(x => x);
// 42, 41, 310, 39, 38, 31, 210, 29
Если вам нужно поддерживать 1010 и 101, как указано в комментариях, это становится немного сложнее, но вы все равно можете использовать аналогичную стратегию. Хотя в этот момент решение Дираджа начинает выглядеть более привлекательным.
var list = new List<int>() { 210, 29, 42, 310, 39, 38, 41, 31, 99, 101, 910, 1010 };
var sortedList = list.OrderByDescending(x => Int32.Parse(x.ToString().Substring(0, x.Length() - (x % 10 == 0 ? 2 : 1))))
.ThenByDescending(x => x);
// 1010, 101, 910, 99, 42, 41, 310, 39, 38, 31, 210, 29
IntExtensions.cs
public static class IntExtensions
{
public static int Length(this int value)
{
value = Math.Abs(value);
if (value < 10) return 1;
if (value < 100) return 2;
if (value < 1000) return 3;
if (value < 10000) return 4;
if (value < 100000) return 5;
if (value < 1000000) return 6;
if (value < 10000000) return 7;
if (value < 100000000) return 8;
if (value < 1000000000) return 9;
return 10;
}
}