IdentityComparer
IdentityComparer implements IEqualityComparer<IIdentity>.
IEqualityComparer<IIdentity> equalityComparer = IdentityComparer.Default;
It compares following properties: Part, Parent, Components, Label. Uses label accessor comparer if available.
string typename = typeof(string).AssemblyQualifiedName;
// Parse
IIdentity id2 = IdentityAccessors.Default.TypeName.MemoryAccessors.Parse(typename.AsMemory());
// Create
IIdentity id1 = IdentityAccessors.Default.TypeName.Create(typeof(string));
// 'True'
WriteLine(equalityComparer.Equals(id1, id2));
Two equal identities produce same hashcode.
// '495866146'
WriteLine(equalityComparer.GetHashCode(id1));
// '495866146'
WriteLine(equalityComparer.GetHashCode(id2));
IdentityComparer implements also IComparer<IIdentity>.
// Order comparer
IComparer<IIdentity> comparer = IdentityComparer.Default;
// Array of identities
IIdentity[] array = new[]
{
Identities.CreateNamespace("System").AppendName("String"),
Identities.CreateNamespace("System").AppendName("Int"),
Identities.CreateNamespace("System"),
Identities.CreateNamespace("Avalanche").AppendNamespace("Identity").AppendName("IIdentity<T>"),
Identities.CreateNamespace("Avalanche").AppendNamespace("Identity").AppendName("Identity<T>"),
Identities.CreateNamespace("Avalanche").AppendNamespace("Service").AppendName("IService"),
Identities.CreateNamespace("Avalanche"),
};
// Sort array
Array.Sort(array, comparer);
// Print array
foreach (IIdentity id in array)
WriteLine(IdentityAccessors.Default.TypeName.MemoryAccessors.Printing.Print(id));
Avalanche Avalanche.Identity.IdentityAvalanche.Identity.IIdentity Avalanche.Service.IService System System.Int System.String
Case Insensitive
IdentityComparer.CaseInsensitive overrides label accessor string comparers with StringComparer.OrdinalIgnoreCase.
// Order comparer
IdentityComparer comparer = IdentityComparer.CaseInsensitive;
//
IIdentity id1 = Identities.CreateNamespace("sYsTeM").AppendName("StRiNg");
IIdentity id2 = Identities.CreateNamespace("SYSTEM").AppendName("string");
// '-1907792046'
WriteLine(comparer.GetHashCode(id1));
WriteLine(comparer.GetHashCode(id2));
// 'True'
WriteLine(comparer.Equals(id1, id2));
// 'False'
WriteLine(id1.Equals(id2));
CaseInsensitive comparer also sorts insensitive.
// Order comparer
IComparer<IIdentity> comparer = IdentityComparer.CaseInsensitive;
// Array of identities
IIdentity[] array = new[]
{
Identities.CreateNamespace("system").AppendName("String"),
Identities.CreateNamespace("SysTem").AppendName("Int"),
Identities.CreateNamespace("system"),
Identities.CreateNamespace("AvalaNche").AppendNamespace("Identity").AppendName("IIdentity<T>"),
Identities.CreateNamespace("avalancHe").AppendNamespace("Identity").AppendName("Identity<T>"),
Identities.CreateNamespace("AvalanchE").AppendNamespace("Service").AppendName("IService"),
Identities.CreateNamespace("Avalanche"),
};
// Sort array
Array.Sort(array, comparer);
// Print array
foreach (IIdentity id in array)
WriteLine(IdentityAccessors.Default.TypeName.MemoryAccessors.Print(id));
Avalanche avalancHe.Identity.IdentityAvalaNche.Identity.IIdentity AvalanchE.Service.IService system SysTem.Int system.String
Other Special Cases
Comparer can be constructed with argument 'partsToDisregard:' that lists parts that are not to be compared.
// "System.String, Library, Version=1.2.3, Culture=neutral, PublicKeyToken=0102030405060708"
IIdentity typeid1 =
IdentityBase
.Create<byte[]>(new byte[] { 1, 2, 3, 4, 5, 6, 7, 8 }, IdentityParts.PublicKeyToken, "Hex")
.Append<string>("neutral", IdentityParts.Culture, LabelAccessors.Default.String)
.Append<string>("Library", IdentityParts.Library, LabelAccessors.Default.String)
.Append<string>("1.2.3", IdentityParts.Version, LabelAccessors.Default.String)
.AppendNamespace("System")
.AppendName("String");
// "System.String, Library, Version=2.3.4, Culture=en, PublicKeyToken=0807060504030201"
IIdentity typeid2 =
IdentityBase.Create<byte[]>(new byte[] { 8, 7, 6, 5, 4, 3, 2, 1 }, IdentityParts.PublicKeyToken, "Hex")
.Append<string>("en", IdentityParts.Culture, LabelAccessors.Default.String)
.Append<string>("Library", IdentityParts.Library, LabelAccessors.Default.String)
.Append<string>("2.3.4", IdentityParts.Version, LabelAccessors.Default.String)
.AppendNamespace("System")
.AppendName("String");
// Compare with regular comparer: "False"
WriteLine(IdentityComparer.Default.Equals(typeid1, typeid2));
// Create comparer that ignores: none, version, culture, and token
IdentityComparer comparer = new IdentityComparer(partsToDisregard: new HashSet<Label8> { "", "Version", "Culture", "PuKeyTkn" });
// Compare now: "True"
WriteLine(comparer.Equals(typeid1, typeid2));
Comparer can also be constructed with argument 'partsToRegard:' that is a list of parts only to compare.
// Create comparer that compares only: name, namespace, library
IdentityComparer comparer2 = new IdentityComparer(partsToRegard: new HashSet<Label8> { "Name", "Namespce", "Library" });
// Compare now: "True"
WriteLine(comparer2.Equals(typeid1, typeid2));
Full Example
Full example
using System;
using System.Collections.Generic;
using Avalanche.Accessor;
using Avalanche.Identity;
using Avalanche.Serialization;
using Avalanche.Utilities;
using static System.Console;
class identitycomparer
{
public static void Run()
{
{
// <01>
IEqualityComparer<IIdentity> equalityComparer = IdentityComparer.Default;
// </01>
// <02>
string typename = typeof(string).AssemblyQualifiedName;
// Parse
IIdentity id2 = IdentityAccessors.Default.TypeName.MemoryAccessors.Parse(typename.AsMemory());
// Create
IIdentity id1 = IdentityAccessors.Default.TypeName.Create(typeof(string));
// 'True'
WriteLine(equalityComparer.Equals(id1, id2));
// </02>
// <03>
// '495866146'
WriteLine(equalityComparer.GetHashCode(id1));
// '495866146'
WriteLine(equalityComparer.GetHashCode(id2));
// </03>
}
{
// <11>
// Order comparer
IComparer<IIdentity> comparer = IdentityComparer.Default;
// Array of identities
IIdentity[] array = new[]
{
Identities.CreateNamespace("System").AppendName("String"),
Identities.CreateNamespace("System").AppendName("Int"),
Identities.CreateNamespace("System"),
Identities.CreateNamespace("Avalanche").AppendNamespace("Identity").AppendName("IIdentity<T>"),
Identities.CreateNamespace("Avalanche").AppendNamespace("Identity").AppendName("Identity<T>"),
Identities.CreateNamespace("Avalanche").AppendNamespace("Service").AppendName("IService"),
Identities.CreateNamespace("Avalanche"),
};
// Sort array
Array.Sort(array, comparer);
// Print array
foreach (IIdentity id in array)
WriteLine(IdentityAccessors.Default.TypeName.MemoryAccessors.Printing.Print(id));
// </11>
}
WriteLine();
{
// <12>
// Order comparer
IdentityComparer comparer = IdentityComparer.CaseInsensitive;
//
IIdentity id1 = Identities.CreateNamespace("sYsTeM").AppendName("StRiNg");
IIdentity id2 = Identities.CreateNamespace("SYSTEM").AppendName("string");
// '-1907792046'
WriteLine(comparer.GetHashCode(id1));
WriteLine(comparer.GetHashCode(id2));
// 'True'
WriteLine(comparer.Equals(id1, id2));
// 'False'
WriteLine(id1.Equals(id2));
// </12>
}
WriteLine();
{
// <13>
// Order comparer
IComparer<IIdentity> comparer = IdentityComparer.CaseInsensitive;
// Array of identities
IIdentity[] array = new[]
{
Identities.CreateNamespace("system").AppendName("String"),
Identities.CreateNamespace("SysTem").AppendName("Int"),
Identities.CreateNamespace("system"),
Identities.CreateNamespace("AvalaNche").AppendNamespace("Identity").AppendName("IIdentity<T>"),
Identities.CreateNamespace("avalancHe").AppendNamespace("Identity").AppendName("Identity<T>"),
Identities.CreateNamespace("AvalanchE").AppendNamespace("Service").AppendName("IService"),
Identities.CreateNamespace("Avalanche"),
};
// Sort array
Array.Sort(array, comparer);
// Print array
foreach (IIdentity id in array)
WriteLine(IdentityAccessors.Default.TypeName.MemoryAccessors.Print(id));
// </13>
}
{
// Create
// <20>
// "System.String, Library, Version=1.2.3, Culture=neutral, PublicKeyToken=0102030405060708"
IIdentity typeid1 =
IdentityBase
.Create<byte[]>(new byte[] { 1, 2, 3, 4, 5, 6, 7, 8 }, IdentityParts.PublicKeyToken, "Hex")
.Append<string>("neutral", IdentityParts.Culture, LabelAccessors.Default.String)
.Append<string>("Library", IdentityParts.Library, LabelAccessors.Default.String)
.Append<string>("1.2.3", IdentityParts.Version, LabelAccessors.Default.String)
.AppendNamespace("System")
.AppendName("String");
// "System.String, Library, Version=2.3.4, Culture=en, PublicKeyToken=0807060504030201"
IIdentity typeid2 =
IdentityBase.Create<byte[]>(new byte[] { 8, 7, 6, 5, 4, 3, 2, 1 }, IdentityParts.PublicKeyToken, "Hex")
.Append<string>("en", IdentityParts.Culture, LabelAccessors.Default.String)
.Append<string>("Library", IdentityParts.Library, LabelAccessors.Default.String)
.Append<string>("2.3.4", IdentityParts.Version, LabelAccessors.Default.String)
.AppendNamespace("System")
.AppendName("String");
// Compare with regular comparer: "False"
WriteLine(IdentityComparer.Default.Equals(typeid1, typeid2));
// Create comparer that ignores: none, version, culture, and token
IdentityComparer comparer = new IdentityComparer(partsToDisregard: new HashSet<Label8> { "", "Version", "Culture", "PuKeyTkn" });
// Compare now: "True"
WriteLine(comparer.Equals(typeid1, typeid2));
// </20>
// <21>
// Create comparer that compares only: name, namespace, library
IdentityComparer comparer2 = new IdentityComparer(partsToRegard: new HashSet<Label8> { "Name", "Namespce", "Library" });
// Compare now: "True"
WriteLine(comparer2.Equals(typeid1, typeid2));
// </21>
}
}
}