2011-01-31 15 views
0

我只想使用LINQ语句以下方法。我返回字符串列表,但首先我得到了NetworkInterface列表。使用LINQ,C#和列表重构网络接口

public static List<string> ObtenerDireccionesDeInterfacesDeRedActivos() 
{ 
    var listaDirecciones = new List<string>(); 
    var interfacesActivos = 
     (from networkInterface in NetworkInterface.GetAllNetworkInterfaces() 
      let 
       /*IPv4InterfaceStatistics*/ 
       statistics = networkInterface.GetIPv4Statistics() 
      where 
       // filter so we see only Internet adapters     
       networkInterface.OperationalStatus == OperationalStatus.Up 
       && networkInterface.NetworkInterfaceType != NetworkInterfaceType.Tunnel 
       && networkInterface.NetworkInterfaceType != NetworkInterfaceType.Loopback 

       // all testing seems to prove that once an interface comes online  
       // it has already accrued statistics for both received and sent... 
       && (statistics.BytesReceived > 0) && (statistics.BytesSent > 0) 
      select 
      networkInterface).ToList<NetworkInterface>(); 

    foreach (NetworkInterface nic in interfacesActivos) 
    { 
     var ips = nic.GetIPProperties().UnicastAddresses; 
     foreach (var ip in ips) 
     { 
      listaDirecciones.Add(ip.Address.ToString()); 
     } 
    } 

    return listaDirecciones; 
} 

有什么建议吗?

回答

2

ToList<NetworkInterface>()调用是不必要的。没有理由在枚举枚举之前将这个查询变为列表。

此外,您可能会考虑让此方法返回IEnumerable<string>(而不是listaDirecciones.Add(ip.Address.ToString());只是做yield return ip.Address.ToString()),并让调用方决定是否需要将其转换为列表。

1

你可以用下面的代码替换你的循环:

return new List<string>(
    from nic in interfacesActivos 
    from ips in nic.GetIPProperties().UnicastAddresses 
    select ip.Address.ToString()); 
+0

就个人而言,我更喜欢@ cdhowie的回答我的,但如果你想返回一个`名单 `,我的解决方案应该工作。 – Jacob 2011-01-31 19:41:55

1

只要改变你的最后loop有:

return interfacesActivos.SelectMany(nic => nic.GetIPProperties().UnicastAddresses) 
         .Select(ip => ip.ToString()) 
         .ToList(); 

编辑:

由于cdhowie说,你可以跳过ToList<NetworkInterface>()

此外,根据你的需要,你可以跳过我的代码片段的ToList()过了,只是返回IEnumerable<string>