[英]List<string> C# custom sorting. Underscore after digits
I have a list: "a_a", "a1a", "aaa". 我有一个列表:“ a_a”,“ a1a”,“ aaa”。
I need to sort it in following way: "a1a", "a_a", "aaa". 我需要按以下方式对其进行排序:“ a1a”,“ a_a”,“ aaa”。
In other words I need '_' symbols to appear right after digits but before letters. 换句话说,我需要“ _”符号出现在数字之后但字母之前。
I know it is possible to use custom Comparer, but I haven't found any nice solution for this issue, only dirty hacks, for example: 我知道可以使用自定义的比较器,但是我没有找到任何解决此问题的好方法,例如,肮脏的黑客程序,例如:
Compare(string x, string y){
return Comparer.Default.Compare(x.Replace("_", "9z"), y.Replace("_", "9z"));
}
According to standard ASCII table: 根据标准ASCII表:
'0'..'9' have codes 0x30..0x39
'_' -/- 0x5F
'a'..'z' -/- 0x61..0x7A
so since codes are in right order, you can use ordinal comparison: 因此,由于代码顺序正确,因此可以使用顺序比较:
List<String> list = new List<string> {
"a1a", "a_a", "aaa"
};
list.Sort((Comparison<String>) (
(String left, String right) => {
return String.CompareOrdinal(left, right);
}
));
...
// a1a, a_a, aaa
Console.Write(String.Join(", ", list));
Here's a custom string comparer which will take a char comparer, so you can compare characters however you want. 这是一个自定义字符串比较器,它将使用一个字符比较器,因此您可以根据需要比较字符。 That being said, make sure
StringComparer.Ordinal
doesn't do the job before implementing your own comparers. 话虽如此,在实现自己的比较器之前,请确保
StringComparer.Ordinal
不会执行此工作。
public class CustomStringComparer : IComparer<string>
{
readonly IComparer<char> charComparer;
public CustomStringComparer(IComparer<char> charComparer)
{
this.charComparer = charComparer;
}
public int Compare(string a, string b)
{
int result = 0;
for (int i = 0; (i < a.Length || i < b.Length) && result == 0 ; i++)
{
if (i >= a.Length || i >= b.Length)
{
return i >= a.Length ? -1 : 1;
}
result = charComparer.Compare(a[i], b[i]);
}
return result;
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.