测试面试问题:
我有一个if
语句来检查IP地址的所有条件是否满足,如果是,我希望它写IP地址是否有效。我应该自己使用循环逻辑,而不是使用其他类库,如ipaddress。parse
public static void Main(string[] args)
{
string ipAddress = "10.121.300.21";
string[] sections = ipAddress.Split('.');
string invalid = "The IP address: {0} is invalid!";
string valid = "The IP address: {0} is valid";
for (var i = 0; i < sections.Length; i++)
{
double ipNum = int.Parse(sections[i]);
if (ipNum > 0 && ipNum < 255 && sections.Length == 4)
{
Console.WriteLine(valid, ipAddress);
}
else
{
Console.WriteLine(invalid, ipAddress);
Console.WriteLine("section number {0} is invalid. ", sections[i]);
}
}
}
现在它返回:
The IP address: 10.121.300.21 is valid
The IP address: 10.121.300.21 is valid
The IP address: 10.121.300.21 is invalid!
section number 300 is invalid.
The IP address: 10.121.300.21 is valid```
我想让它在一行中返回它是否有效而不是逐个遍历数组中的每一项
您可以使用IPAddress.TryParse
进行一次检查
判断字符串是否为有效的IP地址。
可以同时使用IPv4和IPv6。然而,你需要阅读备注,看看它是否真的适合你的需要
评论
注意这个方法接受的ipString值是有效的解析为Int64,然后将该Int64视为an的长值IP地址按网络字节顺序排列,类似于IPAddress构造函数。这意味着该方法返回true如果Int64被成功解析,即使它表示一个地址这不是一个有效的IP地址。例如,如果ipString为"1"方法返回true,即使"1"(或0.0.0.1)不是一个有效的IP地址,您可能期望此方法返回false。解决这个Bug会破坏现有的应用程序,所以当前的行为不会改变了。您的代码可以避免这种行为,通过确保它只使用此方法解析点分十进制格式的IP地址。
var ipAddress = "2001:0db8:85a3:0000:0000:8a2e:0370:7334";
Console.WriteLine($"{ipAddress}: {(IPAddress.TryParse(ipAddress, out _) ? "Valid" : "invalid")}");
2001:0db8:85a3:0000:0000:8a2e:0370:7334: Valid