我有一个包含十六进制值的字符串类型列表,并且这些值的长度不同。因此List可以将FA1和FA以及F9F作为列表中的值,取决于用户输入,我想知道对此进行排序的最佳方法是什么。
所以问题是这个列表排序后的顺序是FA1,FA,F9F应该是FA1,F9F,FA。
答案 0 :(得分:2)
您可以对列表进行排序并传递自定义比较功能,请参阅http://msdn.microsoft.com/en-us/library/3da4abas.aspx
该函数可以将十六进制字符串转换为常规整数并比较这些整数。转换可以在Convert.ToInt32
:
int n = Convert.ToInt32("FF1", 16);
请参阅http://msdn.microsoft.com/en-us/library/1k20k614.aspx
可能是这样的:
list.Sort(delegate(string lhs, string rhs)
{
int n = Convert.ToInt32(lhs, 16);
int m = Convert.ToInt32(rhs, 16);
return (n > m) ? -1 : (n < m) ? +1 : 0;
});
或(参见@ AlexR的评论)
list.Sort(delegate(string lhs, string rhs)
{
return Convert.ToInt32(rhs, 16) - Convert.ToInt32(lhs, 16);
});
答案 1 :(得分:0)
感谢@AlexR,我使用此代码来解决问题。
ListOfString.Sort(delegate(string temp1, string temp2)
{
if (temp1.Length > temp2.Length) return 1;
else if (temp1.Length < temp2.Length) return -1;
return temp1.CompareTo(temp2);
});
如果你想让它下降,只需这样做
ListOfString.Sort(delegate(string temp1, string temp2)
{
if (temp1.Length < temp2.Length) return 1;
else if (temp1.Length > temp2.Length) return -1;
return temp1.CompareTo(temp2) * -1;
});
答案 2 :(得分:-2)
对我的评论作为补充,比较代码如下所示:
int compare(string a, string b) {
if (a.StartsWith("0")) // Short circuit if RegEx won't do anything
a = Regex.Replace(a, "^0+", ""); // RegEx replacement of all leading 0's by ""
if (b.StartsWith("0"))
b = Regex.Replace(b, "^0+", "");
if (a.Length != b.Length)
return a.Length - b.Length; // < 0 for a < b, > 0 for a > b
else
return a.CompareTo(b);
}
请不要咬我的语法,我还没有用C#编码一段时间,因为在工作中我们使用Java。