2011-01-31 10 views
0

次のメソッドにはLINQ文のみを使用します。私は文字列のリストを返しますが、最初にNetworkInterfaceのリストを取得します。LINQ、C#およびリストNetworkInterfaceを使用したリファクタリング

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

1

をするだけで、あなたの最後のloopを変更:

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

EDIT:

あなたは、言っcdhowieとして、 ToList<NetworkInterface>()をスキップできます。

また、あなたのニーズに応じて、あなたも私のコードスニペットのToList()をスキップすることができ、そしてただ個人的にIEnumerable<string>

関連する問題