C# 基于封闭的时间戳对字符串列表重新排序

C# 基于封闭的时间戳对字符串列表重新排序,c#,C#,使用WinC窗体。我有两份清单: 第一个列表:字符串按括号内的时间戳排序 List<string> lst1 = new List<string>(); //TimeStamps Between brackets lst1.Add("Attack(1:05)"); lst1.Add("MoveUp(1:35)"); lst1.Add("MoveDown(1:48)"); lst1.Add("MoveLeft(2:15)"); lst1.Add("MoveDown(2:24

使用WinC窗体。我有两份清单:

第一个列表:字符串按括号内的时间戳排序

List<string> lst1 = new List<string>();
//TimeStamps Between brackets
lst1.Add("Attack(1:05)");
lst1.Add("MoveUp(1:35)");
lst1.Add("MoveDown(1:48)");
lst1.Add("MoveLeft(2:15)");
lst1.Add("MoveDown(2:24)");
lst1.Add("MoveUp(2:50)");
lst1.Add("MoveLeft(3:04)");
lst1.Add("MoveUp(5:15)");
lst1.Add("MoveLeft(7:30)");
//ETC.
List<string> lst2 = new List<string>();
//TimeStamps Between brackets
lst2.Add("Armor Lvl1(0:04)");
lst2.Add("Loom(0:10)");
lst2.Add("Balistics(4:42)");
lst2.Add("Mail Armor(5:02)");
lst2.Add("Ring(6:12)");
lst2.Add("Fire Holes(8:44)");
lst2.Add("Attack Lvl2(10:13)");
lst2.Add("Defence Lvl1(12:33)");
lst2.Add("Defence Lvl2(20:11)");
//ETC.
现在,我需要按时间戳对这个组合列表重新排序,以便输出如下所示:

//output of lst1 in order by timestamp
Armor Lvl1(0:04)
Loom(0:10)
Attack(1:05)
MoveUp(1:35)
MoveDown(1:48)
MoveLeft(2:15)
MoveDown(2:24)
MoveUp(2:50)
MoveLeft(3:04)
Balistics(4:42)
Mail Armor(5:02)
MoveUp(5:15)
Ring(6:12)
MoveLeft(7:30)
Fire Holes(8:44)
Attack Lvl2(10:13)
Defence Lvl1(12:33)
Defence Lvl2(20:11)
有什么线索可以实现这个顺序吗

一些提示:

要从字符串中提取时间戳,请执行以下操作:

Regex.Match("Defence Lvl2(20:11)", @"\(([^)]*)\)").Groups[1].Value;
该类型不强制排序,因此将根据插入顺序进行排序。如果这些时间戳是插入对象时的时间戳,那么对它们进行相应排序是完全合理的

要实现排序,需要编写自己的比较方法和调用,同时将此方法作为委托IComparson或在实现IComparer的类中传递


由于这样的原因,我强烈建议您考虑这些对象应该是对象而不是字符串,因为将字符串名称和TimeSIPN时间戳拆分为两个字段将使排序使用x= > x时间戳的简单问题而不是需要通过正则表达式[0~9] {1-2 }:[09] { 2 }提取时间戳。\等等。

这里有一个没有regex或linq的解决方案

只用老式的手

    static void Test()
    {
      List<string> list = new List<string>();
      list.Add("Armor Lvl1(0:04)");
      list.Add("Loom(0:10)");
      list.Add("Balistics(4:42)");
      list.Add("Mail Armor(5:02)");
      list.Add("Ring(6:12)");
      list.Add("Fire Holes(8:44)");
      list.Add("Attack Lvl2(10:13)");
      list.Add("Defence Lvl1(12:33)");
      list.Add("Defence Lvl2(20:11)");
      list.Add("Attack(1:05)");
      list.Add("MoveUp(1:35)");
      list.Add("MoveDown(1:48)");
      list.Add("MoveLeft(2:15)");
      list.Add("MoveDown(2:24)");
      list.Add("MoveUp(2:50)");
      list.Add("MoveLeft(3:04)");
      list.Add("MoveUp(5:15)");
      list.Add("MoveLeft(7:30)");
      foreach ( var item in SortTheListByTime(list) )
        Console.WriteLine(item);
    }

对于您的问题,解决方案很简单

如果您使用linq的OrderBy,然后将圆括号中的字符串解析为TimeSpan,那么事情将很简单,如

var result = list.OrderBy(x => TimeSpan.Parse(x.Split('(', ')')[1])).ToList();
如果将此结果打印到控制台,则输出将为

result.ForEach(x => {
    Console.WriteLine(x);
});

Console.ReadLine();
输出:


看起来您必须解析内容,然后根据时间戳进行排序。因此,可以引入一个额外的数据结构来包含数据文本和时间戳,然后根据that@OlivierRogier我以前从未做过这样的事情,但举个例子可能会有更大的帮助。在提示部分,我输入了一个代码来提取括号之间的内容,例如20:11@OlivierRogier是的,第一个和第二个列表都是按顺序排列的。这两者的结合并不重要。只有需要订购的组合。@OlivierRogier谢谢你兄弟!虽然我三年前才开始学习了7年,但我在c方面的知识不如你。今天再次感谢你。我会试一试。函数系统有一个小问题。ArgumentException:“已存在具有相同键的条目。”我不介意重复条目。答案已更新。该算法假设,如果字符串格式中出现任何错误或重复,则忽略该项。Stellar logic!谢谢你,噢,我!!我喜欢单线无汗解决方案。非常感谢你!很高兴听到,如果可能,请接受回答:
var result = list.OrderBy(x => TimeSpan.Parse(x.Split('(', ')')[1])).ToList();
result.ForEach(x => {
    Console.WriteLine(x);
});

Console.ReadLine();