List<string> C# 自定义排序。数字后加下划线
List<string> C# custom sorting. Underscore after digits
我有一个列表:"a_a"、"a1a"、"aaa"。
我需要按以下方式排序:"a1a"、"a_a"、"aaa"。
换句话说,我需要“_”符号出现在数字之后但字母之前。
我知道可以使用自定义比较器,但我还没有找到解决这个问题的好方法,只有肮脏的技巧,例如:
Compare(string x, string y){
return Comparer.Default.Compare(x.Replace("_", "9z"), y.Replace("_", "9z"));
}
根据标准 ASCII table:
'0'..'9' have codes 0x30..0x39
'_' -/- 0x5F
'a'..'z' -/- 0x61..0x7A
因此,由于代码顺序正确,您可以使用顺序比较:
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));
这是一个自定义字符串比较器,它将采用字符比较器,因此您可以根据需要比较字符。话虽这么说,请确保 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;
}
}
我有一个列表:"a_a"、"a1a"、"aaa"。
我需要按以下方式排序:"a1a"、"a_a"、"aaa"。
换句话说,我需要“_”符号出现在数字之后但字母之前。
我知道可以使用自定义比较器,但我还没有找到解决这个问题的好方法,只有肮脏的技巧,例如:
Compare(string x, string y){
return Comparer.Default.Compare(x.Replace("_", "9z"), y.Replace("_", "9z"));
}
根据标准 ASCII table:
'0'..'9' have codes 0x30..0x39
'_' -/- 0x5F
'a'..'z' -/- 0x61..0x7A
因此,由于代码顺序正确,您可以使用顺序比较:
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));
这是一个自定义字符串比较器,它将采用字符比较器,因此您可以根据需要比较字符。话虽这么说,请确保 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;
}
}