C#中字符串排序的问题和解决⽅法
先说下问题,简单的说就是⼀组数据
String[] data = new string[]{
"-3A01","-03A02",
"-301","-302",
"-201","-202",
"-101","-102",
"101","102",
"201","202",
"301","302",
"3A01","3A02",
"T3A01","T3A02"
};
我想按照字符串排序,排序原理,我理所应当的想到是单个字符⽐较⼤⼩后,进⾏排序,但是我排序后结果是:
-03A02
101
-101
102
-102
201
-201
202
-202
301
-301
302
-302
3A01
-3A01
3A02
T3A01
⾸先我感觉排序顺序错了,因为按照预想的规则应该负号开头的字符串是在⼀起的才对。
然后我查资料在MSDN上看到这样⼀段话:
使⽤字词排序规则的操作执⾏⼀个区域敏感⽐较,在这个⽐较中可能会为⾮字母数字的 Unicode 字符分配特殊权重。使⽤字词排序规则和特定区域的约定,连字符(“-”)的权重可能⾮常⼩,因此“coop”和“co-op”在排序列表中是紧挨着出现的。
然后基本就明⽩了,在C#中“-”负号的权限因为英⽂本⾝的缘故,⾃动降低的权限,导致这样的排序问题出现。
随后我寻了下解决⽅案:
在List<T>.sort⽅法中可以⾃⼰写排序⽅法,或者实现⼀个类继承IComparer这个接⼝,在实现的Compare中⽐较字符串的语句可以这样写:string.Compare(x, y, StringComparison.Ordinal);
第三个参数给出的解释是“⽐较字符串使⽤序号排序规则”
如此⽐较“-”就不会⾃动被降低权限了。
还有⼀种可能性就是不存在这样的sort⽅法给我们⽤,⽐如DataTable中,在DataTable中我选择了这样的⽅法:
public class String2 : IComparable, IComparable<String2>
{
private string val;
public String2(string str)
{
val = str;
}
public override string ToString()
{
return this.val;
}
public int CompareTo(String2 obj)
{
if (obj == null)
return1;
else
return string.Compare(val, obj.val, StringComparison.Ordinal);字符串长度排序c语言
}
public int CompareTo(object obj)
{
String2 other = obj as String2;
if (other == null)
return1;
else
{
return string.Compare(val, other.val, StringComparison.Ordinal);
}
}
}
⾸先我⾃⼰声明了⼀种类型,继承了IComparable, IComparable<String2>,实现了⾥⾯的CompareTo⽅法;
然后在DataTable中列的类型设定为String2,如此排序就是正常的了。
------------------------------------------------------------------------------------------------------------------------------------------------------------------
以上就是在字符串排序上的遇到的问题和解决⽅案,不知道有没有更好的解决⽅案,希望⼤家指出错误,
还是⼩菜鸟⼀个。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。