Linq/Lambda OrderBy委托列出IP地址的<string>

luk*_*fer 15 c# linq lambda ip-address

特定 List<string> ips = new List<string>();

我需要按逻辑顺序对IP地址列表进行排序(即"192.168.0.2"出现在"192.168.0.100"之前).

目前(并且正确地,按字母顺序排列)列表是否包含:

192.168.0.1
192.168.0.2
192.168.0.10
192.168.0.200
Run Code Online (Sandbox Code Playgroud)

ips.OrderBy(p => p) 收益:

192.168.0.1
192.168.0.10
192.168.0.2
192.168.0.200
Run Code Online (Sandbox Code Playgroud)

SLa*_*aks 19

你需要做一个比较器:(测试)

class IPComparer : IComparer<string> {
    public int Compare(string a, string b) {
        return Enumerable.Zip(a.Split('.'), b.Split('.'), 
                             (x, y) => int.Parse(x).CompareTo(int.Parse(y)))
                         .FirstOrDefault(i => i != 0); 
    }
}
Run Code Online (Sandbox Code Playgroud)

然后你可以写

ips.OrderBy(p => p, new IPComparer()) 
Run Code Online (Sandbox Code Playgroud)


jas*_*son 6

我会System.Net.IPAddress像这样创建一个比较器

class IPAddressComparer : IComparer<IPAddress> {
    public int Compare(IPAddress x, IPAddress y) {
        byte[] first = x.GetAddressBytes();
        byte[] second = y.GetAddressBytes();
        return first.Zip(second, (a, b) => a.CompareTo(b))
                    .FirstOrDefault(c => c != 0);
    }   
}
Run Code Online (Sandbox Code Playgroud)

然后按以下步骤操作:

var list = new List<string>() {
    "192.168.0.1",
    "192.168.0.10",
    "192.168.0.2",
    "192.168.0.200"
};
var sorted = list.OrderBy(s => IPAddress.Parse(s), new IPAddressComparer());
Run Code Online (Sandbox Code Playgroud)