using System.Collections.Generic; using System.Net; namespace AMWD.Common.Comparer { /// /// Defines a method to compare two IP addresses. /// public class IPAddressComparer : IComparer { /// /// Compares two IP addresses and returns a value indicating whether one is less than, /// equal to, or greater than the other. /// /// The first IP address. /// The second IP address. /// /// A signed integer that indicates the relative values of x and y, as shown in the following table. /// /// /// Value /// Meaning /// /// /// Less than zero /// x is less than y. /// /// /// Zero /// x equals y. /// /// /// Greater than zero /// x is greater than y. /// /// /// public int Compare(IPAddress x, IPAddress y) { if (x == null && y == null) return 0; if (x == null) return -1; if (y == null) return 1; byte[] xBytes = x.GetAddressBytes(); byte[] yBytes = y.GetAddressBytes(); // Make IPv4 and IPv6 comparable byte[] left = xBytes.Length == 16 ? xBytes : [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, xBytes[0], xBytes[1], xBytes[2], xBytes[3]]; byte[] right = yBytes.Length == 16 ? yBytes : [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, yBytes[0], yBytes[1], yBytes[2], yBytes[3]]; // Compare byte for byte for (int i = 0; i < left.Length; i++) { int result = left[i].CompareTo(right[i]); if (result != 0) return result; } return 0; } } }