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;
}
}
}