【问题标题】:Refactoring using LINQ, C# and Lists NetworkInterface使用 LINQ、C# 和 Lists NetworkInterface 进行重构
【发布时间】:2011-01-31 19:36:46
【问题描述】:

我只想对以下方法使用 LINQ 语句。我返回字符串列表,但首先我得到 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;
}

有什么建议吗?

【问题讨论】:

    标签: c# linq list foreach


    【解决方案1】:

    ToList&lt;NetworkInterface&gt;() 调用是不必要的。没有理由在枚举之前必须将此查询转换为列表。

    此外,您可以考虑让此方法返回 IEnumerable&lt;string&gt;(而不是 listaDirecciones.Add(ip.Address.ToString());,只需执行 yield return ip.Address.ToString())并让调用者决定是否需要将其转换为列表。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 就我个人而言,我更喜欢@cdhowie 的回答,但如果你想返回List&lt;string&gt;,我的解决方案应该可以工作。
      【解决方案3】:

      只需将您的最后一个 loop 更改为:

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

      编辑:

      正如cdhowie所说,您可以跳过ToList&lt;NetworkInterface&gt;()

      另外,根据您的需要,您也可以跳过我的代码 sn-p 的 ToList(),而只返回一个 IEnumerable&lt;string&gt;

      【讨论】:

        猜你喜欢
        • 2020-02-16
        • 2014-02-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-07-26
        • 2020-01-24
        • 2019-02-03
        相关资源
        最近更新 更多