2

如何在c#中的ipaddress数组中按升序排列所有ipaddresses我有ipaddress类的数组

ipaddress[] device = new ipaddress[10];

它有不同的 ip 值,我想按升序排列它们

4

5 回答 5

5

您可以使用Version-trick

样本数据:

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'不包含'Parse'的定义。我:那你至少没有使用 .NET framework 4.0。 Version.Parse 你:是的,我正在使用 .NET 框架 3.5 那么我需要做些什么改变呢?

然后你可以使用 IPAddress.GetAddressBytesfor Enumerable.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();

更新2

谢谢,但是如果数组的任何成员为空,它就会停止。如果我们想使用包含一些空值的数组。我想最后订购空值。

然后使用此查询,该查询将Byte[]withByte.MaxValue用于空值:

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();
于 2013-02-20T12:43:22.917 回答
0

如果我是正确的,你可以这样做:

var list = new string[5];
list = list.OrderByDescending(x => x).ToArray();
于 2013-02-20T12:39:38.440 回答
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字段不是 a string,您可能希望实现IComparable该字段的接口IP,以提高排序质量,即:获取11.100 > 2.100而不是2.100 > 11.100

于 2013-02-20T12:39:54.453 回答
0

使用其中一种 Array.Sort 方法,Array.Sort 方法等。例子很简单:

Array.Sort(device, (a,b) => [compare here, return int] );
于 2013-02-20T12:40:21.743 回答
0

这应该有效:

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

但更好地使用List而不是Array

于 2013-02-20T12:42:26.273 回答