繁体   English   中英

如何对列表进行排序<string>通过该字符串的一部分 Desc

[英]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 主体中交换xy

如果您的列表长,这会更快(使用快速排序)并且不需要列表的新副本的内存。

您可以在 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,使用OrderByThenBy运算符对列表进行排序。 最后我只select原始字符串作为结果。

这个解决方案可以缩短很多 - 但像往常一样以可读性为代价。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM