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