对包含十六进制值的字符串列表进行排序

时间:2014-07-23 21:24:47

标签: c# string list sorting hex

我有一个包含十六进制值的字符串类型列表,并且这些值的长度不同。因此List可以将FA1和FA以及F9F作为列表中的值,取决于用户输入,我想知道对此进行排序的最佳方法是什么。

所以问题是这个列表排序后的顺序是FA1,FA,F9F应该是FA1,F9F,FA。

3 个答案:

答案 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。