按数字排序字符串列表(1,2,...,9,10而不是1,10,2)

时间:2011-01-24 23:03:11

标签: c# .net sorting numbers

我有一个像这样的列表:

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

3 个答案:

答案 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,并对该解析值进行比较。