using System.Collections.Generic;
using System.Text.RegularExpressions;
public Item(string col1, string col2, string col3)
public static void Main()
var Object = new List<Item>{
new Item("0000", "Item1", "P11"),
new Item("0000", "Item0", "1"),
new Item("0000", "Item0", "10"),
new Item("0000", "Item1", "P3"),
new Item("0000", "Item0", "12"),
new Item("0000", "Item0", "3"),
new Item("0000", "Item0", "2"),
new Item("0000", "Item1", "P12"),
new Item("0000", "Item1", "P1"),
new Item("0000", "Item1", "P10"),
new Item("0000", "Item1", "P2"),
new Item("0000", "Item0", "11")
var orderedCustomers = Object
.ThenBy(d => TxtPart(d.Col3))
.ThenBy(d => NumPart(d.Col3));
foreach (var x in orderedCustomers)
Console.WriteLine(x.Col1 + ", " + x.Col2 + ", " + x.Col3);
public static string TxtPart(string s) => Regex.Match(s, @"^[^0-9]*").Value;
public static int NumPart(string s) => int.TryParse(Regex.Match(s, @"[0-9]*$").Value, out int v) ? v : int.MaxValue;