我有这种方法:
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进行排序。
答案 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"