我有一个这样的清单:
List<string> list_lines = new List<string>();
list_lines.add("name1__pass1__com__14__55");
list_lines.add("name2__pass2__com__14__5445");
list_lines.add("name3__pass3__com__14__456456");
list_lines.add("name4__pass4__com__14__1357");
list_lines.add("name5__pass5__com__14__20000");
list_lines.add("name6__pass6__com__14__25");
list_lines.add("name7__pass7__com__14__12");
以及更多......
如你所见,这里有一个分隔符 - &gt;该列表中每个字符串中的“__” 意思是:
string[] Separator = new string[] { "__" };
foreach(string s in list_lines)
{
string[] line_ar = s.Split(Separator, StringSplitOptions.None);
int Num = int.parse(line_ar[4]);
}
我想按该列表的Num部分对该列表进行排序 我使用StackOverflow测试一些方法,但是它们中存在一个大错误列表。
真的很感谢帮助我做好准备
答案 0 :(得分:9)
升序:
list_lines = list_lines.OrderBy(s => int.Parse(s.Split(Separator, StringSplitOptions.None)[4])).ToList();
说明:
list_lines = list_lines.OrderByDescending(s => int.Parse(s.Split(Separator, StringSplitOptions.None)[4])).ToList();
答案 1 :(得分:2)
var myList = list_lines.OrderBy(x => int.Parse(x.Split(new string[] {"__"}, StringSplitOptions.None)[4])).ToList();
答案 2 :(得分:2)
如果数字总是在最后一个下划线字符后面开始,那么这应该有效:
var sortedList = list_lines
.OrderByDescending(l => int.Parse(l.Substring(l.LastIndexOf("_") + 1)))
.ToList();
答案 3 :(得分:1)
其他答案会创建新列表,该列表按您希望的方式排序。如果您想要对相同的列表进行排序,可以尝试这样的事情:
Func<string, int> getNum = str => int.Parse(str.Split(Separator, StringSplitOptions.None)[4]);
list_lines.Sort((x, y) => getNum(x).CompareTo(getNum(y)));
这使用an overload of List<>.Sort
。如果您想降序,请在x
lambda正文中交换y
和Comparison<>
。
如果您的列表非常长,则速度更快(使用快速排序),并且不需要内存列表的新副本。
答案 4 :(得分:0)
您可以利用LINQ函数中的lambda表达式,如OrderBy
string[] Separator = new string[] { "__" };
var sortedList = list_lines
.OrderBy(s => int.Parse(s.Split(Separator, StringSplitOptions.None)[4]))
.ToList();
作为一个不相关的附注,请使用正确的C#命名约定,以便您的代码更易于阅读,并与现有的C#代码库统一。例如。没有使用大写字母(Separator
- > separator
)开始本地变量名称,并使用较低的驼峰案例(Pascal案例),以防它包含更多单词(list_lines
- &gt; {{1 }})
答案 5 :(得分:0)
请原谅我在此处回答相关问题:
Sat 2020-03-21 06:03:31.129: 03: [100001] Player 1
Sat 2020-03-21 06:03:33.119: 02: [620524] Player 22
我想首先对列表进行排序:1)两个[]之间的数字2)直到:nn:
的日期以下是其中一种方法:
void Main()
{
var originalList = new List<string>
{
@"Sat 2020-03-21 06:03:31.129: 03: [100001] Player 1",
@"Sat 2020-03-21 06:03:33.119: 02: [620524] Player 22",
};
var sortableList = originalList.Select(x => splitTheLine(x));
var result = sortableList.OrderBy(x => x.numberPart).ThenBy(x => x.datePart).Select(x => x.wholeString);
}
(DateTime datePart, int numberPart, string wholeString) splitTheLine(string x)
{
string[] separator = { "[", "]", ": " };
var result = x.Split(separator, StringSplitOptions.None);
return (DateTime.Parse(result[0]), int.Parse(result[3]), x );
}
我定义了一种方法splitTheLine
来提取 date 和 number 部分以及原始字符串。它返回一个元组。然后,我将该方法与LINQ的select
运算符一起使用,以检索具有三个“列”的列表。再次使用LINQ,使用OrderBy
和ThenBy
运算符对列表进行排序。最后,我select
仅将原始字符串作为结果。
此解决方案可以大大缩短-但像往常一样以可读性为代价。