【问题标题】:How Sort A List<string> By A Part Of That String Desc如何按该字符串的一部分对列表进行排序 Desc
【发布时间】:2012-11-10 23:32:01
【问题描述】:

我有一个这样的列表:

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

非常感谢帮助我解决它

【问题讨论】:

    标签: c# string list sorting


    【解决方案1】:
    var myList = list_lines.OrderBy(x => int.Parse(x.Split(new string[] {"__"}, StringSplitOptions.None)[4])).ToList();
    

    【讨论】:

    • 我认为他不会按拆分项目的数量来订购。我想他想按项目中的最后一个数字订购。
    • 这是按每个字符串拆分成的元素数量排序的,这不是要求的(注意拆分示例中的Num)。
    • 我一发布就明白了;)。重新发布。
    【解决方案2】:

    上升:

    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();
    

    【讨论】:

      【解决方案3】:

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

      var sortedList = list_lines
          .OrderByDescending(l => int.Parse(l.Substring(l.LastIndexOf("_") + 1)))
          .ToList();
      

      【讨论】:

      • 你为什么使用 Substring 而不是 split?它更快吗?
      • @Diego:我没有测量过,但我更喜欢它。 Split 将为每行创建一个包含 5 个字符串的数组,而 Substring 只会将数字部分作为字符串返回。
      • 是的,这是真的。但是如果分隔符更改则必须更改此代码(除非您将+ 1 替换为+ separator.Length - 1)。此外,如果在数字之后添加了一些“字段”,这将变为......我不确定它在这种特殊情况下有多大用处,但会记住它!
      【解决方案4】:

      您可以利用 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) 开头,如果包含更多单词 (list_lines -> listLines),则使用小写驼峰式 (Pascal case)

      【讨论】:

        【解决方案5】:

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

        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&lt;&gt;.Sort。如果要降序排列,请在 Comparison&lt;&gt; lambda 主体中交换 xy

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

        【讨论】:

          【解决方案6】:

          请原谅我在这里回答了一个相关问题:

          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 来提取 datenumber 部分以及原始字符串。它返回一个元组。然后我使用 LINQ 的 select 运算符的方法来检索具有三个“列”的列表。再次使用 LINQ,使用OrderByThenBy运算符对列表进行排序。最后我select只有结果的原始字符串。

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

          【讨论】:

            猜你喜欢
            • 2014-02-21
            • 1970-01-01
            • 2017-11-20
            • 1970-01-01
            • 1970-01-01
            • 2021-06-10
            • 2015-09-27
            • 2014-04-15
            • 2020-06-13
            相关资源
            最近更新 更多