Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将IP字符串列表排序为带有空白项的数字_C#_List_Sorting_Lambda - Fatal编程技术网

C# 将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

我有一个作为字符串抓取的IP地址列表,我正在排序。在对列表进行排序时,我将字符串转换为整数,并将IP地址中最常见的“.”替换为“”。这可以在下面看到

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我在下面的回答中试图澄清。