我有一个像这样的列表:
var l = new List<string> {"bla 1.txt","bla 2.txt","bla 10.txt","bla 3.txt"};
如果我调用l.Sort(),列表将以1,10,2,3的顺序排序,这从纯字符串的角度来看是有意义的,但是从用户角度来看很糟糕。
由于我不想/不能强迫我的用户将它们命名为01,02,03,...我想知道是否有内置方法或简单算法来正确检测和排序数字,所以我有1,2,3,10?由于数字只有1或2个字符长(即不超过99),我可以做一个正则表达式,暂时为所有1位数字加前缀0和排序,但在重新发明轮子之前,我想知道是否已存在某些内容?
.net 3.5SP1如果重要,不是4.0
答案 0 :(得分:20)
最好的方法是使用IComparer
。这已经完成,可以是found on code project。
答案 1 :(得分:10)
为什么不写一些能从字符串中提取数字的东西呢?
// 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)));
这让我觉得效率很低,但它至少应该功能。
答案 2 :(得分:0)
您可以实现自己的IComparer,它可能在输入上使用正则表达式(“bla 1.txt”),将其转换为int,并对该解析值进行比较。