如何排序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正在工作,因为我想要的问题是如何排序的数字时,数字是在每个索引字符串的一部分的列表。
此代码适用于开头的正个位数:
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"