C# 使用.orderby对列表进行排序

C# 使用.orderby对列表进行排序,c#,C#,简单的问题,真的,我似乎被困在这里了 我试图在列表中拆分一个字符串,并按第一个“tiddilebage”%d和&h排序,但现在这给了我字符串的最后一位,所以是名称,而不是剩下的时间,我想按第一位排序 我怎样才能扭转这一行动 string lines = tidtilbage.ToString("%d") + " dag(e)" + " " + tidtilbage.ToString("%h") + " time(r)" + " - " +

简单的问题,真的,我似乎被困在这里了

我试图在列表中拆分一个字符串,并按第一个“tiddilebage”%d和&h排序,但现在这给了我字符串的最后一位,所以是名称,而不是剩下的时间,我想按第一位排序

我怎样才能扭转这一行动

string lines = tidtilbage.ToString("%d") + " dag(e)" + " " 
             + tidtilbage.ToString("%h") + " time(r)" + " - " 
             + p.SamAccountName.ToUpper() + " - " + p.DisplayName + "\n\n";

list_sorted.Add(lines.ToString());
string[] Separator = new string[] { "time(r)" };
list_sorted = list_sorted.OrderBy(s => s.Split(Separator, StringSplitOptions.None)[1]).ToList();
当我尝试将索引更改为0而不是1时,我仍然无法获得所需的排序。我得到:

0 dag(e)20次(r)-xx-xx

1 dag(e)3次(r)-xx-xx

13 dag(e)22时间(r)-xx-xx

3 dag(e)23时间(r)-xx-xx

5 dag(e)21次(r)-xx-xx

5 dag(e)21次(r)-xx-xx

6 dag(e)2次(r)-xx-xx

9 dag(e)1次(r)-xx-xx

9 dag(e)21次(r)-xx-xx

之所以发生这种情况,是因为C#集合是基于零索引的
换句话说,
集合[1]
是第二项或集合。如果要按第一项排序,需要使用
[0]

您只需更改:

.OrderBy(s => s.Split(Separator, StringSplitOptions.None)[1])

同时,您的代码还存在一些其他问题:

  • 您不需要将
    .ToString()
    应用于已为字符串的项目:

    list_sorted.Add(lines.ToString()); // incorrect
    list_sorted.Add(lines); // correct
    
  • 您可以使用
    string.Format
    或C#6.0字符串插值代替
    +
    串联

    难以阅读和维护:

    string lines = tidtilbage.ToString("%d") + " dag(e)" + " " 
                 + tidtilbage.ToString("%h") + " time(r)" + " - " 
                 + p.SamAccountName.ToUpper() + " - " + p.DisplayName + "\n\n";    
    
    现在看起来好多了:

    string lines = String.Format("{0:D} dag(e) {0:H} time(r) - {1} - {2}\n\n", 
        tidlitbage, p.SamAccountName.ToUpper(), p.DisplayName);
    
    甚至

    string lines = $"{tidlitbage:D} dag(e) {tidlitbage:H} time(r) - {p.SamAccountName.ToUpper()} - {p.DisplayName}\n\n");
    
  • 之所以会发生这种情况,是因为C#集合是基于零索引的
    换句话说,
    集合[1]
    是第二项或集合。如果要按第一项排序,需要使用
    [0]

    您只需更改:

    .OrderBy(s => s.Split(Separator, StringSplitOptions.None)[1])
    

    同时,您的代码还存在一些其他问题:

  • 您不需要将
    .ToString()
    应用于已为字符串的项目:

    list_sorted.Add(lines.ToString()); // incorrect
    list_sorted.Add(lines); // correct
    
  • 您可以使用
    string.Format
    或C#6.0字符串插值代替
    +
    串联

    难以阅读和维护:

    string lines = tidtilbage.ToString("%d") + " dag(e)" + " " 
                 + tidtilbage.ToString("%h") + " time(r)" + " - " 
                 + p.SamAccountName.ToUpper() + " - " + p.DisplayName + "\n\n";    
    
    现在看起来好多了:

    string lines = String.Format("{0:D} dag(e) {0:H} time(r) - {1} - {2}\n\n", 
        tidlitbage, p.SamAccountName.ToUpper(), p.DisplayName);
    
    甚至

    string lines = $"{tidlitbage:D} dag(e) {tidlitbage:H} time(r) - {p.SamAccountName.ToUpper()} - {p.DisplayName}\n\n");
    

  • 我想你是在第二个位置上分拆

     list_sorted = list_sorted.OrderBy(s => s.Split(Separator, StringSplitOptions.None)[1]).ToList();
    
    尝试更改[0]的[1]

    list_sorted = list_sorted.OrderBy(s => s.Split(Separator, StringSplitOptions.None)[0]).ToList();
    

    或者使用.First(),(使用.Last()您不能使用de Last one),或者.elementAt(X)也很有用。

    我认为您使用的是拆分返回的第二个位置

     list_sorted = list_sorted.OrderBy(s => s.Split(Separator, StringSplitOptions.None)[1]).ToList();
    
    尝试更改[0]的[1]

    list_sorted = list_sorted.OrderBy(s => s.Split(Separator, StringSplitOptions.None)[0]).ToList();
    

    或者使用.First(),(使用.Last()您不能使用de Last one),或者.elementAt(X)也很有用。

    如果我没有错误地理解您的问题,那么您需要的必须是数组[0],而不是[1]。在
    split
    ur字符串之后,第一个数组将被放入数组[0],而不是[1]

    list_sorted = list_sorted.OrderBy(s => s.Split(Separator, StringSplitOptions.None)[0]).ToList();
    

    如果我没有错误地理解您的问题,那么您需要的必须是数组[0],而不是[1]。在
    split
    ur字符串之后,第一个数组将被放入数组[0],而不是[1]

    list_sorted = list_sorted.OrderBy(s => s.Split(Separator, StringSplitOptions.None)[0]).ToList();
    

    谢谢你的回答@Yeldarkurmangaliyev!我仍然没有得到所需的排序。我编辑了我的问题,这样你就能明白我的意思了。:-)我想要最低的=>highest@MathiasRønnowNørtoft因为您对字符串进行排序,所以C#按字典顺序对它们进行排序。您需要先对您的
    tidtilebage
    集合进行排序(我猜,它是
    DateTime
    ),然后将它们转换为字符串
    列表
    。再次感谢,我会尝试的!:-)谢谢你的回答@Yeldarkurmangaliyev!我仍然没有得到所需的排序。我编辑了我的问题,这样你就能明白我的意思了。:-)我想要最低的=>highest@MathiasRønnowNørtoft因为您对字符串进行排序,所以C#按字典顺序对它们进行排序。您需要先对您的
    tidtilebage
    集合进行排序(我猜,它是
    DateTime
    ),然后将它们转换为字符串
    列表
    。再次感谢,我会尝试的!:-)