Рефакторинг с использованием LINQ, C # и Lists NetworkInterface - PullRequest
0 голосов
/ 31 января 2011

Я хочу использовать только оператор 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;
}

есть предложения?

Ответы [ 3 ]

2 голосов
/ 31 января 2011

Вызов ToList<NetworkInterface>() не нужен.Нет никаких причин, по которым вам нужно было бы превратить этот запрос в список перед его перечислением.

Кроме того, вы можете рассмотреть возможность возврата этим методом IEnumerable<string> (вместо listaDirecciones.Add(ip.Address.ToString()); просто выполните yield return ip.Address.ToString())и пусть вызывающий абонент решит, нужно ли ему преобразовать его в список.

1 голос
/ 31 января 2011

Просто измените ваш последний loop на:

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

РЕДАКТИРОВАТЬ:

Как cdhowie сказалВы можете пропустить ToList<NetworkInterface>().

Кроме того, в зависимости от ваших потребностей, вы также можете пропустить ToList() моего фрагмента кода и просто вернуть IEnumerable<string>

1 голос
/ 31 января 2011

Вы можете заменить свой цикл следующим кодом:

return new List<string>(
    from nic in interfacesActivos
    from ips in nic.GetIPProperties().UnicastAddresses
    select ip.Address.ToString());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...