This code allows you to add .CompareTo()
to any type derived from object
without having to implement IComparable interface. Return values are consistent with c# IComparable return values.
return | description |
---|---|
0 | objects match |
< 0 | object 1 precedes object 2 |
> 0 | object 1 follows object 2 |
This is a recursive comparer. When it receives an object containing complex properites, lists and lists of complex properties, it will delve into the properties and do a deep comparison.
Note: when comparing lists, order matters. {1, 2, 3}
does not match {1, 3, 2}
.
Usage:
object.CompareTo(object otherObject, BindingFlags bindingFlags, ValueTypeComparerFactory.ComparerFlags comparerFlags)
Value | Condition |
---|---|
object | any type derived from object |
otherObject | any type derived from object; same type as object |
bindingFlags | OPTIONAL. Refer to BindingFlags documentation. Applies when comparing classes. Default is BindingFlags.Public | BindingFlags.Instance |
comparerFlags | OPTIONAL.ValueTypeComparerFactory.ComparerFlags.IgnoreId - comparer will not look at properties named ID, Id or id.ValueTypeComparerFactory.ComparerFlags.IgnoreKeyAttributeProperties - comparer will not look at properties with a [Key] attribute.Applies when comparing classes. Default is ValueTypeComparerFactory.ComparerFlags.None . |
class Program
{
static void Main()
{
var person1 = new Person { FirstName = "fn", LastName = "ln" };
var person2 = new Person { FirstName = "fn", LastName = "ln" };
Console.WriteLine($"Compare person one to person two: {person1.CompareTo(person2)}");
var hedy = new Person { FirstName = "Hedy", LastName = "Lamaar" };
var mae = new Person { FirstName = "Mae", LastName = "Jemison" };
Console.WriteLine($"Compare Person one to Person Two: {hedy.CompareTo(mae)}");
Console.WriteLine($"Compare Person two to Person one: {mae.CompareTo(hedy)}");
person1.Id = 3;
person2.Id = 4;
Console.WriteLine($"Compare person {person1.Id} to person {person2.Id}, ignore id: {person1.CompareTo(person2, comparerFlags:ValueTypeComparerFactory.ComparerFlags.IgnoreId)}");
Console.WriteLine($"Compare person {person1.Id} to person {person2.Id}, ignore key: {person1.CompareTo(person2, comparerFlags: ValueTypeComparerFactory.ComparerFlags.IgnoreKeyAttributeProperties)}");
Console.ReadLine();
}
}
Output:
Compare person one to person two: 0
Compare person one to person two: -5
Compare person two to person one: 5
Compare person 3 to person 4, ignore id: 0
Compare person 3 to person 4, ignore key: 0