using System.Collections.Generic;
using System.Text.RegularExpressions;
public sealed class NaturalComparer : IComparer<string> {
private static int CompareChunks(string x, string y) {
if (x[0] >= '0' && x[0] <= '9' && y[0] >= '0' && y[0] <= '9') {
string tx = x.TrimStart('0');
string ty = y.TrimStart('0');
int result = tx.Length.CompareTo(ty.Length);
result = tx.CompareTo(ty);
return string.Compare(x, y);
public int Compare(string? x, string? y) {
if (ReferenceEquals(x, y))
.Where(item => !string.IsNullOrEmpty(item))
.Where(item => !string.IsNullOrEmpty(item))
for (int i = 0; i < Math.Min(itemsX.Count, itemsY.Count); ++i) {
int result = CompareChunks(itemsX[i], itemsY[i]);
return itemsX.Count.CompareTo(itemsY.Count);
public static void Main() {
string[] demo = new string[] {
Array.Sort(demo, new NaturalComparer());
Console.WriteLine(string.Join(Environment.NewLine, demo));