2013-04-18 2 views
4

У меня есть этот метод linq, как получить все свойства сетевой карты компьютера, и я не хочу использовать linq, могу ли я помочь его конвертировать и не использовать Linq?Convert Linq to regular function

public NetworkAdapter[] GetAll() 
{ 
    return (from adapter in NetworkInterface.GetAllNetworkInterfaces() 
      from uniCast in adapter.GetIPProperties().UnicastAddresses 
      where !System.Net.IPAddress.IsLoopback(uniCast.Address) && uniCast.Address.AddressFamily != AddressFamily.InterNetworkV6 
      let lastGatewayAddress = adapter.GetIPProperties().GatewayAddresses.LastOrDefault() 
      select new NetworkAdapter() 
      { 
       string Name = adapter.Name, 
       string ID = adapter.Id, 
       string Description = adapter.Description, 
       string IPAddress = uniCast.Address.ToString(), 
       string NetworkInterfaceType = adapter.NetworkInterfaceType.ToString(), 
       string Speed = adapter.Speed.ToString("#,##0"), 
       string MacAddress = getMacAddress(adapter.GetPhysicalAddress().ToString()), 
       string gatewayIpAddress = string.Join(" ", adapter.GetIPProperties().GatewayAddresses.Select(a => a.Address)) 
      }).ToArray(); 
} 

Это то, что я попробовал;

public void get() 
{ 
    NetworkInterface[] nics = NetworkInterface.GetAllNetworkInterfaces(); 

    foreach (NetworkInterface adapter in nics) 
    { 
     Description = adapter.Description; 
     Name = adapter.Name; 
     MacAddress = adapter.GetPhysicalAddress().ToString(); 

     IPInterfaceProperties ips = adapter.GetIPProperties(); 
     UnicastIPAddressInformationCollection uniCast = ips.UnicastAddresses; 

     foreach (UnicastIPAddressInformation ipInfo in uniCast) 
     { 
      if (ipInfo.Address.AddressFamily != AddressFamily.InterNetworkV6) 
      { 

      } 
     } 

    } 
} 
+3

Почему бы вы ** не ** хотите использовать Linq, если он делает ваш код проще? –

+1

Я взял этот код отсюда и хочу узнать, как его преобразовать, а не использовать Linq – user2214609

+1

@Shaul - Потому что иногда это не так. Linq отлично, но если вы не привыкли к этому, требуется некоторое время, чтобы понять, что происходит. Также вы не можете поставить контрольные точки «внутри» операторов Linq. (Или вы можете?) – Corak

ответ

5

Хотя я не понимаю, почему, здесь.

С небольшой помощью от моего друга ReSharper (и мой вход, потому что ReSharper не мог бы сделать все это):

public NetworkAdapter[] GetAll() 
    { 
     List<NetworkAdapter> list = new List<NetworkAdapter>(); 
     foreach (NetworkInterface adapter in NetworkInterface.GetAllNetworkInterfaces()) 
      foreach (UnicastIPAddressInformation uniCast in adapter.GetIPProperties().UnicastAddresses) 
      { 
       if (!System.Net.IPAddress.IsLoopback(uniCast.Address) && uniCast.Address.AddressFamily != AddressFamily.InterNetworkV6) 
       { 
        StringBuilder gatewayIPAddresses = new StringBuilder(); 
        string gatewayIPAddressesDisplay = string.Empty; 
        foreach (var address in adapter.GetIPProperties().GatewayAddresses) 
        { 
         gatewayIPAddresses.Append(address.Address); 
         gatewayIPAddresses.Append(" "); 
        } 

        if (gatewayIPAddresses.Length > 0) 
        { 
         gatewayIPAddressesDisplay = gatewayIPAddresses.ToString().TrimEnd(' '); 
        } 

        list.Add(new NetworkAdapter() 
         { 
          Name = adapter.Name, 
          ID = adapter.Id, 
          Description = adapter.Description, 
          IPAddress = uniCast.Address.ToString(), 
          NetworkInterfaceType = adapter.NetworkInterfaceType.ToString(), 
          Speed = adapter.Speed.ToString("#,##0"), 
          MacAddress = getMacAddress(adapter.GetPhysicalAddress().ToString()), 
          gatewayIpAddress = gatewayIPAddressesDisplay 
         }); 
       } 
      } 
     return list.ToArray(); 
    } 
+2

Вы все еще используете Linq, например. 'GetIPProperties(). GatewayAddresses.Select (a => a.Address)' –

+0

+1 для ReSharper - качает дом! –

+0

Собственно, это было бы ближе к реальности, если вместо создания списка у вас есть метод итератора (т. Е. С использованием 'yield return'), а затем вызывается' ToArray' на его результат. –

0

Попробуйте это:

public NetworkAdapter[] GetAll() 
     { 
      var networkAdapters = new List<NetworkAdapter>(); 

      foreach (NetworkInterface adapter in NetworkInterface.GetAllNetworkInterfaces()) 
      { 
       foreach (UnicastIPAddressInformation uniCast in adapter.GetIPProperties().UnicastAddresses) 
       { 
        if (!System.Net.IPAddress.IsLoopback(uniCast.Address) && 
         uniCast.Address.AddressFamily != AddressFamily.InterNetworkV6) 
        { 
         GatewayIPAddressInformation lastGatewayAddress = adapter.GetIPProperties().GatewayAddresses.LastOrDefault(); 

         networkAdapters.Add(new NetworkAdapter() 
               { 
                Name = adapter.Name, 
                ID = adapter.Id, 
                Description = adapter.Description, 
                IPAddress = uniCast.Address.ToString(), 
                NetworkInterfaceType = adapter.NetworkInterfaceType.ToString(), 
                Speed = adapter.Speed.ToString("#,##0"), 
                MacAddress = getMacAddress(adapter.GetPhysicalAddress().ToString()), 
                gatewayIpAddress = string.Join(" ", adapter.GetIPProperties().GatewayAddresses.Select(a => a.Address)) 
               }); 
        } 
       } 
      } 

      return networkAdapters.ToArray(); 
     } 
+0

Вы все еще используете Linq, например. 'GetIPProperties(). GatewayAddresses.Select (a => a.Address)' –