对字符串使用自定义比较器
Using custom comparer for strings
我有以下列表:
var ips = new List<string> {
"192.168.5.1",
"192.168.0.2",
"192.168.0.3",
"192.168.0.4",
"192.168.1.1",
"192.168.1.2",
"192.168.1.3",
"192.168.1.4"
}.OrderBy(p => p.Ip);
看起来可行,是否有必要编写一个自定义比较器,如this one:
public class MyComparer : IComparer<string>
{
public int Compare(string x, string y)
{
int ip1 = IPAddress.Parse(x).ToInteger();
int ip2 = IPAddress.Parse(y).ToInteger();
return (((ip1 - ip2) >> 0x1F) | (int)((uint)(-(ip1 - ip2)) >> 0x1F));
}
}
试试这个例子。
192.168.0.1
192.168.0.2
192.168.0.10
192.168.0.200
如果你申请OrderBy
,它会给你这个结果。
192.168.0.1
192.168.0.10
192.168.0.2
192.168.0.200
所以你必须像下面的例子一样制作你自己的自定义比较器。
我有以下列表:
var ips = new List<string> {
"192.168.5.1",
"192.168.0.2",
"192.168.0.3",
"192.168.0.4",
"192.168.1.1",
"192.168.1.2",
"192.168.1.3",
"192.168.1.4"
}.OrderBy(p => p.Ip);
看起来可行,是否有必要编写一个自定义比较器,如this one:
public class MyComparer : IComparer<string>
{
public int Compare(string x, string y)
{
int ip1 = IPAddress.Parse(x).ToInteger();
int ip2 = IPAddress.Parse(y).ToInteger();
return (((ip1 - ip2) >> 0x1F) | (int)((uint)(-(ip1 - ip2)) >> 0x1F));
}
}
试试这个例子。
192.168.0.1
192.168.0.2
192.168.0.10
192.168.0.200
如果你申请OrderBy
,它会给你这个结果。
192.168.0.1
192.168.0.10
192.168.0.2
192.168.0.200
所以你必须像下面的例子一样制作你自己的自定义比较器。