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