您可以使用LINQ过滤结果:
Dim ipHostEntry = Dns.GetHostEntry(Dns.GetHostName)
Dim ipAddress = ipHostEntry.AddressList.FirstOrDefault(Function(ip) ip.AddressFamily = AddressFamily.InterNetwork)
If ipAdress IsNot Nothing Then
' Output ipAdress.ToString()
Else
' No IPv4 address could be retrieved
End If
说明:
IPHostAddress.AddressList
返回一个Array(Of IPAddress)
实现IEnumerable
接口的,因此可以被 LINQ 表达式枚举。
FirstOrDefault
将返回 AddressList 数组中与作为 的第一个也是唯一参数提交的谓词 lambda 函数匹配的第一个元素FirstOrDefault
。必须编写谓词函数以返回布尔值。
数组从第一个元素迭代到最后一个元素,并对每个元素求值 lambda 函数,其参数ip
是当前迭代项。用ip.AddressFamily = AddressFamily.InterNetwork
我们判断当前项是否为 IPv4 地址。如果是这样,则表达式计算true
并返回项目FirstOrDefault
。如果计算结果为false
,则检查数组中的下一项,依此类推。如果没有元素与谓词匹配,则FirstOrDefault
返回默认值,在这种情况下Nothing
(注意:扩展First
的工作方式相同,但如果没有项目与谓词匹配,则抛出异常;两者都First
可以FirstOrDefault
在没有任何参数的情况下调用,它们返回的第一个元素那么序列)。
我更喜欢上面基于扩展方法的表示法,但如果您愿意,也可以使用原始的From In Where Select
LINQ 表示法:
Dim ipAddress = (From ip In ipHostEntry.AddressList
Where ip.AddressFamily = AddressFamily.InterNetwork
Select ip)(0)
请注意,在这种情况下,这(0)
是另一个扩展方法的参数。ElementAtOrDefault(index As Integer)