Array.Sort用于带数字的字符串

C.J*_*.J. 0 c#

我有以下示例代码:

List<string> test = new List<string>();
test.Add("Hello2");
test.Add("Hello1");
test.Add("Welcome2");
test.Add("World");
test.Add("Hello11");
test.Add("Hello10");
test.Add("Welcome0");
test.Add("World3");
test.Add("Hello100");
test.Add("Hello20");
test.Add("Hello3");

test.Sort();
Run Code Online (Sandbox Code Playgroud)

但是会发生什么,test.Sort将数组排序为:

"Hello1", 
"Hello10", 
"Hello100", 
"Hello11", 
"Hello2", 
"Hello20", 
"Hello3", 
"Welcome0", 
"Welcome2", 
"World", 
"World3"
Run Code Online (Sandbox Code Playgroud)

有没有办法对它们进行排序,以便它们string也具有正确的数字顺序?(如果结尾没有数字string,那么string总是先行 - 按字母顺序排列)

预期产量:

"Hello1", 
"Hello2", 
"Hello3", 
"Hello10", 
"Hello11", 
"Hello20", 
"Hello100", 
"Welcome0", 
"Welcome2", 
"World", 
"World3"
Run Code Online (Sandbox Code Playgroud)

Sel*_*enç 7

以下是使用LINQ的一种可能方式:

 var orderedList = test
            .OrderBy(x => new string(x.Where(char.IsLetter).ToArray()))
            .ThenBy(x =>
            {
                int number;
                if (int.TryParse(new string(x.Where(char.IsDigit).ToArray()), out number))
                    return number;
                return -1;
            }).ToList();
Run Code Online (Sandbox Code Playgroud)