2

我有一个这样的清单:

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 测试了一些方法,但其中有一个大列表的错误。

非常感谢帮助我解决它

4

6 回答 6

10

上升:

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();
于 2012-11-22T14:37:39.880 回答
2
var myList = list_lines.OrderBy(x => int.Parse(x.Split(new string[] {"__"}, StringSplitOptions.None)[4])).ToList();
于 2012-11-22T14:37:23.080 回答
2

如果数字总是在最后一个下划线字符之后开始,那么这应该有效:

var sortedList = list_lines
    .OrderByDescending(l => int.Parse(l.Substring(l.LastIndexOf("_") + 1)))
    .ToList();
于 2012-11-22T14:38:51.463 回答
1

其他答案会创建一个按您想要的方式排序的新列表。相反,如果您希望对相同的列表进行排序,则可以尝试以下操作:

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. 如果您想要降序,请在lambda 正文中交换x和。yComparison<>

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

于 2012-11-22T15:04:48.610 回答
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-> listLines)

于 2012-11-22T14:42:55.073 回答
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来提取日期数字部分以及原始字符串。它返回一个元组。然后我使用selectLINQ 运算符的方法来检索具有三个“列”的列表。再次使用 LINQ,使用OrderByandThenBy运算符对列表进行排序。最后,我select只使用结果的原始字符串。

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

于 2020-03-23T21:37:31.570 回答