1
0

Adding Domain and IPAddress comparer

This commit is contained in:
2024-06-16 21:09:38 +02:00
parent 8e31601d75
commit 508379d704
8 changed files with 262 additions and 15 deletions

View File

@@ -27,7 +27,7 @@
<ItemGroup Condition="'$(TargetFramework)' == 'netstandard2.0'">
<PackageReference Include="Microsoft.AspNetCore.HttpOverrides" Version="2.2.0" />
<PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="6.0.4" />
<PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="6.0.0" />
</ItemGroup>
<ItemGroup Condition="'$(TargetFramework)' == 'net8.0'">

View File

@@ -0,0 +1,57 @@
using System.Collections.Generic;
namespace AMWD.Common.Comparer
{
/// <summary>
/// Defines a method to compare two domain strings.
/// </summary>
public class DomainComparer : IComparer<string>
{
/// <summary>
/// Compares two domain strings and returns a value indicating
/// whether one is less than, equal to, or greater than the other.
/// </summary>
/// <param name="x">The first domain string.</param>
/// <param name="y">The second domain string.</param>
/// <returns>
/// A signed integer that indicates the relative values of x and y, as shown in the following table:
/// <list type="table">
/// <listheader>
/// <term>Value</term>
/// <description>Meaning</description>
/// </listheader>
/// <item>
/// <term>Less than zero</term>
/// <description>x is less than y</description>
/// </item>
/// <item>
/// <term>Zero</term>
/// <description>x equals y</description>
/// </item>
/// <item>
/// <term>Greater than zero</term>
/// <description>x is greater than y</description>
/// </item>
/// </list>
/// </returns>
public int Compare(string x, string y)
{
string[] left = x.Split('.');
string[] right = y.Split('.');
int result = left.Length.CompareTo(right.Length);
if (result != 0)
return result;
// Compare from TLD to subdomain with string comparison
for (int i = left.Length - 1; i >= 0; i--)
{
result = left[i].CompareTo(right[i]);
if (result != 0)
return result;
}
return 0;
}
}
}

View File

@@ -0,0 +1,71 @@
using System.Collections.Generic;
using System.Net;
namespace AMWD.Common.Comparer
{
/// <summary>
/// Defines a method to compare two IP addresses.
/// </summary>
public class IPAddressComparer : IComparer<IPAddress>
{
/// <summary>
/// Compares two IP addresses and returns a value indicating whether one is less than,
/// equal to, or greater than the other.
/// </summary>
/// <param name="x">The first IP address.</param>
/// <param name="y">The second IP address.</param>
/// <returns>
/// A signed integer that indicates the relative values of x and y, as shown in the following table.
/// <list type="table">
/// <listheader>
/// <term>Value</term>
/// <description>Meaning</description>
/// </listheader>
/// <item>
/// <term>Less than zero</term>
/// <description>x is less than y.</description>
/// </item>
/// <item>
/// <term>Zero</term>
/// <description>x equals y.</description>
/// </item>
/// <item>
/// <term>Greater than zero</term>
/// <description>x is greater than y.</description>
/// </item>
/// </list>
/// </returns>
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;
}
}
}

View File

@@ -15,7 +15,7 @@ namespace AMWD.Common.Comparer
public class VersionStringComparer : IComparer<string>
{
private readonly Regex _versionRegex = new("([0-9.]+)");
private readonly Regex _versionRegex = new("([0-9.]+)", RegexOptions.Compiled);
#endif
/// <summary>
@@ -32,16 +32,16 @@ namespace AMWD.Common.Comparer
/// <description>Meaning</description>
/// </listheader>
/// <item>
/// <term>-1</term>
/// <description>x is less than y</description>
/// <term>Less than zero</term>
/// <description>x is less than y.</description>
/// </item>
/// <item>
/// <term>0</term>
/// <description>x equals y</description>
/// <term>Zero</term>
/// <description>x equals y.</description>
/// </item>
/// <item>
/// <term>1</term>
/// <description>x is greater than y</description>
/// <term>Greater than zero</term>
/// <description>x is greater than y.</description>
/// </item>
/// </list>
/// </returns>
@@ -79,7 +79,7 @@ namespace AMWD.Common.Comparer
}
#if NET8_0_OR_GREATER
[GeneratedRegex("([0-9.]+)")]
[GeneratedRegex("([0-9.]+)", RegexOptions.Compiled)]
private static partial Regex VersionRegex();
#endif
}