C# 对字符串列表进行数字排序(1,2,…,9,10而不是1,10,2)
我有这样一份清单:C# 对字符串列表进行数字排序(1,2,…,9,10而不是1,10,2),c#,.net,sorting,numbers,C#,.net,Sorting,Numbers,我有这样一份清单: var l = new List<string> {"bla 1.txt","bla 2.txt","bla 10.txt","bla 3.txt"}; var l=newlist{“bla1.txt”、“bla2.txt”、“bla10.txt”、“bla3.txt”}; 如果我调用l.Sort(),列表将按1,10,2,3的顺序排序,这从纯字符串的角度来看是有意义的,但从用户的角度来看则很糟糕 因为我不想/不能强迫我的用户给他们命名01、02、03,。。。
var l = new List<string> {"bla 1.txt","bla 2.txt","bla 10.txt","bla 3.txt"};
var l=newlist{“bla1.txt”、“bla2.txt”、“bla10.txt”、“bla3.txt”};
如果我调用l.Sort(),列表将按1,10,2,3的顺序排序,这从纯字符串的角度来看是有意义的,但从用户的角度来看则很糟糕
因为我不想/不能强迫我的用户给他们命名01、02、03,。。。我想知道是否有一个内置的方法或简单的算法来正确地检测和排序数字,这样我就有了1,2,3,10?由于数字只有1或2个字符长(即,不超过99个),我可能会使用正则表达式临时在所有1位数字前加上0和排序,但在我重新发明轮子之前,我想知道是否已经存在一些东西
.NET3.5SP1如果这很重要,那么最好的方法是使用
IComparer
。这项工作已经完成,可以继续进行 您可以实现自己的IComparer,它可能在输入上使用正则表达式(“bla 1.txt”),将其转换为int,然后对解析后的值进行比较。为什么不编写一些东西,从字符串中提取数字,像这样
// Note: This could very well be a bad implementation. I'm not too great with Regex.
static int ExtractNumber(string text)
{
Match match = Regex.Match(text, @"(\d+)");
if (match == null)
{
return 0;
}
int value;
if (!int.TryParse(match.Value, out value))
{
return 0;
}
return value;
}
然后,您可以使用以下方法对列表进行排序:
list.Sort((x, y) => ExtractNumber(x).CompareTo(ExtractNumber(y)));
这给我的印象是效率很低,但至少应该是功能性的。看起来相关,看看我过去使用过的相同解决方案的副本-工作起来很有魅力!我喜欢现有的和经过测试的解决方案-工作起来很有魅力!对任何想使用此功能的人的提示:摆脱NumericComparer.cs,将比较函数移动到StringLogicalComparer,使比较(string,string)非静态,并让类实现IComparer,IComparer这是一种“仅链接的答案”。没有登录就无法访问该代码,可能会更改\消失。将其简化为一个适合本文的小类会很有帮助。“现有解决方案”是
shlwapi.dll
strmplogicalw