如何按字母顺序对字母数字列表进行排序

时间:2016-08-17 09:28:58

标签: c# asp.net arrays list sorting

我正在尝试按国家/地区名称对字符串列表进行排序,其中包含每个字符串元素前面的四位数字。但是,我实际上按每个字符串前面的数字排序,而不是按国家/地区名称排序。任何人都可以帮我如何在排序时忽略字符串中的数字。感谢。

List<string> lst = new List<string>();
lst.Add("0003 India");
lst.Add("0005 America");
lst.Add("0004 Japan");
lst.Add("0001 Sweden");
lst.Add("0002 Germany");

lst.Sort();

lstSearchResult.DataSource = lst;
lstSearchResult.DataBind();

我得到的输出:

 0001 Sweden
 0002 Germany
 0003 India
 0004 Japan
 0005 America

我其实想要输出

 0005 America
 0002 Germany
 0003 India
 0004 Japan
 0001 Sweden

5 个答案:

答案 0 :(得分:3)

lst.Sort()不起作用的原因是因为它使用默认的字符串比较 - 它使整个字符串进行排序。你想要做的只是按空格后的字符串部分排序。为此:

您可以在字符串的分割后的第二部分使用Linq的.OrderBy方法:

List<string> lst = new List<string>();

lst.Add("0003 India");
lst.Add("0005 America");
lst.Add("0004 Japan");
lst.Add("0001 Sweden");
lst.Add("0002 Germany");

lst = lst.OrderBy(item => item.Split(' ').ElementAtOrDefault(1)).ToList();

// Or if always by the string from position 5 onward then:
lst = lst.OrderBy(p => p.Substring(5)).ToList();

lstSearchResult.DataSource = lst;
lstSearchResult.DataBind();

答案 1 :(得分:2)

如果您确定有四位数后跟一个空格,则可以使用此Sort(Comparison<T>)重载:

lst.Sort((s1, s2) => String.Compare(s1.Substring(5), s2.Substring(5), StringComparison.Ordinal));
lstSearchResult.DataSource = lst;
lstSearchResult.DataBind();

答案 2 :(得分:1)

作为已经建议的Linq查询和Lambda表达式的替代方法,您可以编写自己的IComparer<T>实现:

private class MyComparer : IComparer<string>
{
    public int Compare(string x, string y)
    {
        return x.Substring(5).CompareTo(y.Substring(5));
    }
}

用法:

// you can also declare this as static for your class or application
var comparer = new MyComparer();

// actual sorting:
lst.Sort(comparer);

答案 3 :(得分:0)

您可以在// Get OAuth token using client credentials string tenantName = "GraphDir1.OnMicrosoft.com"; string authString = "https://login.microsoftonline.com/" + tenantName; AuthenticationContext authenticationContext = new AuthenticationContext(authString, false); // Config for OAuth client credentials string clientId = "118473c2-7619-46e3-a8e4-6da8d5f56e12"; string key = "hOrJ0r0TZ4GQ3obp+vk3FZ7JBVP+TX353kNo6QwNq7Q="; ClientCredential clientCred = new ClientCredential(clientId, key); string resource = "https://graph.windows.net"; string token; try { AuthenticationResult authenticationResult = authenticationContext.AcquireToken(resource, clientCred); token = authenticationResult.AccessToken; } catch (AuthenticationException ex) { Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine("Acquiring a token failed with the following error: {0}", ex.Message); if (ex.InnerException != null) { // You should implement retry and back-off logic according to // http://msdn.microsoft.com/en-us/library/dn168916.aspx . This topic also // explains the HTTP error status code in the InnerException message. Console.WriteLine("Error detail: {0}", ex.InnerException.Message); } } 中使用Split并指定要排序的部分。

OrderBy

答案 4 :(得分:0)

如果数字000#总是4.您可以这样做:

List<string> lst = new List<string>();
lst.Add("0003 India");
lst.Add("0005 America");
lst.Add("0004 Japan");
lst.Add("0001 Sweden");
lst.Add("0002 Germany");

lst = lst.OrderBy(p => p.Substring(5)).ToList();

    lstSearchResult.DataSource = lst;
    lstSearchResult.DataBind();