如何排序List当数字是字符串的一部分时,按从低到高的数字排列

本文关键字:数字 分时 一部 排列 List 排序 何排序 string 字符串 | 更新日期: 2023-09-27 18:16:38

我有这样一个排序方法:

public List<string> SortList(List<string> thread)
        {
            thread = thread
    .OrderBy(str =>
    {
        var match = Regex.Match(str, @"^([-+]?'d+)");
        return match.Success ? int.Parse(match.Groups[1].Value) : int.MaxValue;
    })
    .ToList();
            responsers.Add(new List<string>(thread));
            return thread;
        }

这是调用这个SortList的方法:

public List<string> GetResponsers(string contents)
        {
            string responser = "";
            List<string> threadList = new List<string>();
            int f = 0;
            int startPos = 0;
            while (true)
            {
                string firstTag = "<FONT CLASS='text16b'>";
                string lastTag = "&n";
                f = contents.IndexOf(firstTag, startPos);
                if (f == -1)
                {
                    break;
                }
                int g = contents.IndexOf(lastTag, f);
                startPos = g + lastTag.Length;
                responser = contents.Substring(f + 22, g - f - 22);
                threadList.Add(responser);
            }
            SortList(threadList);
            return threadList;
        }

GetResponsers方法获取html文件的内容。我正在从中解析一些东西。最后,我有一个列表叫做:threadList

此方法每次调用另一个内容并从中解析内容。例如,在这个例子中,threadList包含9个项目。索引0中的第一项是标题所以它没有数字所以我不想触摸它,把它留在索引0中例如:

Hello world ??(*)

现在在索引1中,我也有文本,但前面有一个数字:"1。这是新的。"在索引2中,我也有一个数字文本:"4。你好"以此类推,直到最后一句:最后一项"

问题是在索引1中,它可以有"3"。fgfgfg"在索引3"6。fgfdghjj "

我想按数字排序,但数字是每个字符串的一部分!

例如,在索引1中,我有"3"。hello world"数字3不是整数。数字3是字符串

我使用了一个断点,并且SortList不能很好地工作,它不是每次都按数字排序列表。最后,我希望列表threadList仅为字符串,但数字从第一个数字到最后一个:

"this is the title"
"1. hello"
"2. hello world"
"3. this is third item"
"4. fourth item digits are strings"
"5. this is a test"
"6. this is after sorted"
"7. this is the last item"

解析方法GetResponsers正在工作,因为我想要的问题是如何排序的数字时,数字是在每个索引字符串的一部分的列表。

如何排序List<string>当数字是字符串的一部分时,按从低到高的数字排列

此代码适用于开头的正个位数:

public List<string> SortList(List<string> thread)
{
    var first = thread.Take(1);
    var ordered = thread.Skip(1).OrderBy(s=>char.GetNumericValue(s[0]));
    thread = first.Concat(ordered).ToList();
    return thread;
}

你应该考虑让这个方法只返回void。所以要么这个

public void SortList(List<string> thread)
{
    var first = thread.Take(1);
    var ordered = thread.Skip(1).OrderBy(s=>char.GetNumericValue(s[0]));
    thread = first.Concat(ordered).ToList();
}

或我最喜欢的

public List<string> SortList(List<string> thread)
{
    var first = thread.Take(1);
    var ordered = thread.Skip(1).OrderBy(s=>char.GetNumericValue(s[0]));
    return first.Concat(ordered).ToList();
}

尽管最后一个需要您将调用代码更改为return SortList(threadList);

试试这个:

List<string> list; // this is your input list
var firstRow = list.Take(1);
var orderedRows = list.Skip(1)
    .OrderBy(s=>Int32.Parse(s.Split(' ')[0].TrimEnd('.')));
var result = firstRow.Concat(orderedRows).ToList();

如果你喜欢较短但可读性较差的代码:

var result = list.Take(1)
    .Concat(list.Skip(1)
    .OrderBy(s => Int32.Parse(s.Split(' ')[0].TrimEnd('.')))).ToList();

这样,您就不局限于以一位数开头的字符串。

所有输入字符串必须以数字开头,后面跟着点和空格,如下所示:

"1. "

示例输入:

"this is the title"
"6. this is after sorted"
"1. hello"
"2. hello world"
"82. fourth item digits are strings"
"3. this is third item"
"5. this is a test"
"731. this is the last item"

和输出:

"this is the title"
"1. hello"
"2. hello world"
"3. this is third item"
"5. this is a test"
"6. this is after sorted"
"82. fourth item digits are strings"
"731. this is the last item"