如何按字符串描述</string>的顺序对列表<string>进行排序

时间:2012-11-22 14:33:44

标签: c# string list sorting

我有一个这样的清单:

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测试一些方法,但是它们中存在一个大错误列表。

真的很感谢帮助我做好准备

6 个答案:

答案 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正文中交换yComparison<>

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

答案 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,使用OrderByThenBy运算符对列表进行排序。最后,我select仅将原始字符串作为结果。

此解决方案可以大大缩短-但像往常一样以可读性为代价。