C# 将IP字符串列表排序为带有空白项的数字
我有一个作为字符串抓取的IP地址列表,我正在排序。在对列表进行排序时,我将字符串转换为整数,并将IP地址中最常见的“.”替换为“”。这可以在下面看到C# 将IP字符串列表排序为带有空白项的数字,c#,list,sorting,lambda,C#,List,Sorting,Lambda,我有一个作为字符串抓取的IP地址列表,我正在排序。在对列表进行排序时,我将字符串转换为整数,并将IP地址中最常见的“.”替换为“”。这可以在下面看到 ipAddresses.Sort((a, b) => Convert.ToInt64(a.Address.Trim().Replace(".", "")).CompareTo(Convert.ToInt64(b.Address.Trim().Replace(".", "&q
ipAddresses.Sort((a, b) => Convert.ToInt64(a.Address.Trim().Replace(".", "")).CompareTo(Convert.ToInt64(b.Address.Trim().Replace(".", ""))));
问题是我遇到了一个抛出“System.FormatException”错误的条目。完全错误如下所示
mscorlib.dll中发生“System.FormatException”类型的异常,但未在用户代码中处理
其他信息:输入字符串的格式不正确
当我看到抛出错误的条目时,它的IP地址是空的,所以我假设是空的IP地址导致了这个错误
我的问题是,在对列表进行排序时,应该如何处理空字符串?这里有一种(多种)转换为数值的技术。您可以使用一种简单的方法将ip转换为数字。然后,您可以让该方法具有null、空字符串或无效ip地址的特殊情况,以便您可以选择这些地址位于列表的顶部还是底部
无论您选择哪种技术,您都需要有一些可接受的方法来为IP的每个八位字节赋予适当的意义,以便“1.1.1.1”被视为比“0.255.255.255”更大的值,因为简单地折叠这些值会使“1111”<“255255”变为其他值
public static int GetValue(string ip)
{
IPAddress parsed;
if (IPAddress.TryParse(ip, out parsed))
return BitConverter.ToInt32(parsed.GetAddressBytes(), 0);
else
return int.MaxValue; // Or min value if you want invalid ips at beginning
}
然后您的排序方法变为
ipAddresses.Sort((a,b) => GetValue(a).CompareTo(GetValue(b)));
指向.NET FIDLE的链接:您可以使用Where从列表中筛选出空项
ipAddresses.Where(p => !string.IsNullOrEmpty(p.Address)).ToList().Sort((a, b) => Convert.ToInt64(a.Address.Trim().Replace(".", "")).CompareTo(Convert.ToInt64(b.Address.Trim().Replace(".", ""))));
你可以使用三元运算符<代码> <代码> >代码>:<代码>,或者你可以简单地在代码的开头添加一个<代码> 0”/代码>。但是你可能需要考虑左填充每一个八位字节,所以1.1.1.1>0.255.255.255(除非你喜欢在你的规则中)@ iNoMeScRe>你建议我放< <代码> <代码>或<代码>:< /代码>?我对这些操作符并不完全熟悉,只使用过几次。另外,如果我在字符串的开头加上一个0,会不会弄乱实际有值的条目?@JasonW我不清楚你所说的“左填充”是什么意思@blueberry我在下面的回答中试图澄清。