[英]How Sort A List<string> By A Part Of That String Desc
我有一个这样的清单:
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");
和更多...
如您所见,该列表中的每个字符串中都有一个分隔符 -> "__"。
意思 :
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 测试了一些方法,但是它们中有一个大列表的错误。
非常感谢帮助我解决它
升序:
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();
var myList = list_lines.OrderBy(x => int.Parse(x.Split(new string[] {"__"}, StringSplitOptions.None)[4])).ToList();
如果数字总是在最后一个下划线字符之后开始,那么这应该有效:
var sortedList = list_lines
.OrderByDescending(l => int.Parse(l.Substring(l.LastIndexOf("_") + 1)))
.ToList();
其他答案创建一个新列表,该列表按您想要的方式排序。 相反,如果您希望对相同的列表进行排序,请尝试以下操作:
Func<string, int> getNum = str => int.Parse(str.Split(Separator, StringSplitOptions.None)[4]);
list_lines.Sort((x, y) => getNum(x).CompareTo(getNum(y)));
这使用了List<>.Sort
的重载。 如果您想要降序,请在Comparison<>
lambda 主体中交换x
和y
。
如果您的列表很长,这会更快(使用快速排序)并且不需要列表的新副本的内存。
您可以在 LINQ 函数(如OrderBy
利用 lambda 表达式
string[] Separator = new string[] { "__" };
var sortedList = list_lines
.OrderBy(s => int.Parse(s.Split(Separator, StringSplitOptions.None)[4]))
.ToList();
作为一个无关的旁注,请使用正确的 C# 命名约定,以便您的代码更易于阅读并与现有的 C# 代码库统一。 例如,局部变量名称不以大写字母开头( Separator
-> separator
),并使用小写字母(Pascal case),以防它包含更多单词( list_lines
-> listLines
)
请原谅我在这里回答相关问题:
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
来提取日期和数字部分以及原始字符串。 它返回一个元组。 然后我使用带有 LINQ 的select
运算符的方法来检索包含三个“列”的列表。 再次使用 LINQ,使用OrderBy
和ThenBy
运算符对列表进行排序。 最后我只select
原始字符串作为结果。
这个解决方案可以缩短很多 - 但像往常一样以可读性为代价。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.