开发者

Sorting a List of Strings numerically (1,2,...,9,10 instead of 1,10,2)

开发者 https://www.devze.com 2023-02-06 18:33 出处:网络
I have a List like this: var l = new List<string> {\"bla 1.txt\",\"bla 2.txt\",\"bla 10.txt\",\"bla 3.txt\"};

I have a List like this:

var l = new List<string> {"bla 1.txt","bla 2.txt","bla 10.txt","bla 3.txt"};

If i call l.Sort(), the list gets sorted in the order 1,10,2,3 which makes sense from a pure string point of view, but sucks from a User Perspective.

Since I don't want to/can't force my users to name them 01, 02, 03,... I wonder if there is either a built-in method or simple algorithm to detect and sort numbers properly, so that I have 1,2,3,10? Since the numbers开发者_开发知识库 are only 1 or 2 characters long (i.e., no more than 99) I could possibly do a regex that temporarily prefixes all 1-digit numbers with a 0 and sort, but before I reinvent the wheel I wonder if something already exists?

.net 3.5SP1 if that matters, not 4.0


The best approach is making use of IComparer. This has already been done and can be found on code project.


Why not write something that will extract a number from a string, like this?

// 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;
}

Then you could sort your list using:

list.Sort((x, y) => ExtractNumber(x).CompareTo(ExtractNumber(y)));

This strikes me as pretty inefficient, but it should be functional at least.


You could implement your own IComparer that maybe uses a regular expression on the input ("bla 1.txt"), converts that to an int, and peforms the comparison on that parsed value.

0

精彩评论

暂无评论...
验证码 换一张
取 消