当数字是字符串的一部分时,我如何按最低到最高的数字对List <string>进行排序?</string>

时间:2014-08-04 10:02:59

标签: c# .net winforms

我有这种方法:

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

的List

此方法每次调用另一个内容并从中解析内容。 例如,最后在这种情况下,threadList包含9个项目。 索引0中的第一项是标题,因此它有一个数字,所以我不想触摸它以将其保留在索引0中,例如:

Hello world ?? (*)

现在在索引1中我还有文字,但在它之前有一个数字:&#34; 1。这是新的&#34; 在索引2中,我还有一个带有数字的文本:&#34; 4。你好&#34; 等等,直到拉斯维加斯:&#34; 2。最后一项&#34;

问题是在索引1中我可以拥有&#34; 3。 fgfgfg&#34; 在索引3&#34; 6。 fgfdghjj&#34;

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

例如,在索引1中,我有&#34; 3。你好世界&#34; 数字3不是int。数字3是字符串。

我使用了一个断点,并且SortList不能正常工作,它不会每次都按数字排序List。 最后我希望List 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进行排序。

2 个答案:

答案 0 :(得分:1)

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

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 btw。所以要么这个

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);

答案 1 :(得分:1)

试试这个:

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"