2013-02-20 20 views

回答

4

你可以使用版本帽子戲法

抽樣數據:

IPAddress[] ips = new[]{ 
     IPAddress.Parse("192.168.1.4"), 
     IPAddress.Parse("192.168.1.5"), 
     IPAddress.Parse("192.168.2.1"), 
     IPAddress.Parse("10.152.16.23"), 
     IPAddress.Parse("69.52.220.44"), 
    }; 

順序遞增:

var sortedIps = ips 
    .Select(ip => Version.Parse(ip.ToString())) 
    .OrderBy(v => v) 
    .Select(v => IPAddress.Parse(v.ToString())) 
    .ToArray(); 

結果:

{10.152.16.23} System.Net.IPAddress 
{69.52.220.44} System.Net.IPAddress 
{192.168.1.4} System.Net.IPAddress 
{192.168.1.5} System.Net.IPAddress 
{192.168.2.1} System.Net.IPAddress 

更新

你:它給這個錯誤 'System.Version' 不包含一個定義爲 「解析」。我:那你至少不用.NET框架4.0。 Version.Parse 你:是的,我使用.NET framwork 3.5所以我需要什麼變化 呢?

那麼你可以使用IPAddress.GetAddressBytesEnumerable.OrderBy/ThenBy

sortedIps = ips 
    .Select(ip => new { IP = ip, Bytes = ip.GetAddressBytes() }) 
    .OrderBy(x => x.Bytes[0]).ThenBy(x => x.Bytes[1]).ThenBy(x => x.Bytes[2]).ThenBy(x => x.Bytes[3]) 
    .Select(x => x.IP) 
    .ToArray(); 

UPDATE2

謝謝,但它牛逼停止,如果陣列中的任何成員是null.if我們要 使用包含一些空值的數組。我想最後訂購空值。

然後使用此查詢,它使用與Byte.MaxValue一個Byte[]爲空值:

var sortedIps = ips 
    .Select(ip => new { 
     IP = ip, 
     Bytes = ip == null 
      ? new[] { Byte.MaxValue, Byte.MaxValue, Byte.MaxValue, Byte.MaxValue } 
      : ip.GetAddressBytes() 
    }) 
    .OrderBy(x => x.Bytes[0]).ThenBy(x => x.Bytes[1]).ThenBy(x => x.Bytes[2]).ThenBy(x => x.Bytes[3]) 
    .Select(x => x.IP) 
    .ToArray(); 
+0

感謝您的快速響應,但它給出了此錯誤 'System.Version'的確不包含'Parse'的定義。 – Kevan 2013-02-20 12:48:59

+0

@Kevan:那麼你至少沒有使用.NET Framework 4.0 http://msdn.microsoft.com/en-us/library/system.version.parse(v=vs.100).aspx – 2013-02-20 12:51:07

+0

是的我是使用.NET framwork 3.5 所以我需要做什麼改變? – Kevan 2013-02-20 12:52:50

0

你可以做到這一點,如果我是正確的:

var list = new string[5]; 
list = list.OrderByDescending(x => x).ToArray(); 
+0

爲什麼'=新字符串[]'? 'ToArray()'已經創建了一個新的數組,所以你只是浪費時間在堆上分配內存,你永遠不會使用它。 – Nolonar 2013-02-20 12:41:48

+0

這是示例代碼,可以複製粘貼.. – JMan 2013-02-20 12:50:26

+0

而OrderBy僅在列表中可用,並且需要將其轉換回數組 – JMan 2013-02-20 12:51:09

0

您可以使用LINQ爲

using System.Linq; 

ipaddress[] sortedDevice1 = device.OrderBy(d => d.IP).ToArray(); // assuming the ip address is saved in a field named 'IP' 
ipaddress[] sortedDevice2 = device.OrderByDescending(d => d.IP).ToArray(); // if you need it sorted by descending order 

如果您IP字段不是string,你可能想實現IComparable接口,爲IP領域,以提高分類質量,即:讓11.100 > 2.100代替2.100 > 11.100

0

用途之一Array.Sort方法,其中包括Array.Sort Method。例子很簡單:

Array.Sort(device, (a,b) => [compare here, return int]); 
0

這應該工作:

Array.Sort(devices, (d1, d2) => d1.IPValue.CompareTo(d2.IPValue)); 

但最好使用List代替Array