How to declare natural ordering by implementing the generic IComparable interface in C# .NET

Primitive types such as integers can be ordered naturally in some way. Numeric and alphabetical ordering comes in handy with numbers and strings. However, there’s no natural ordering for your own custom objects with a number of properties.

Consider the following Triangle class:

public class Triangle
{
	public double BaseSide { get; set; }
	public double Height { get; set; }

	public double Area
	{
		get
		{
			return (BaseSide * Height) / 2;
		}
	}
}

Imagine that you want to be able to declare that one triangle is larger or smaller than another one in a natural way. One way to declare natural comparison is by implementing the generic IComparable interface which comes with one method, CompareTo, which returns an integer. The method should return 0 if the compared instances are equal. It should return an integer larger than 0 if “this” current instance is larger/higher/longer etc. than the instance it is compared to. The reverse is true if “this” instance is ranked behind the other instance.

Here comes an example for the Triangle class:

public class Triangle : IComparable<Triangle>
{
	public double BaseSide { get; set; }
	public double Height { get; set; }

	public double Area
	{
		get
		{
			return BaseSide * Height;
		}
	}

	public int CompareTo(Triangle other)
	{
		if (other == null) return 1;
		if (Area > other.Area) return 1;
		return -1;
	}
}

…and here’s how you can call the CompareTo method:

Triangle tOne = new Triangle() { BaseSide = 4, Height = 2 };
Triangle tTwo = new Triangle() { BaseSide = 5, Height = 3 };
if (tOne.CompareTo(tTwo) > 0)
{
	Console.WriteLine("tOne is larger than tTwo: {0} vs. {1}", tOne.Area, tTwo.Area);
}
else
{
	Console.WriteLine("tOne is smaller than tTwo: {0} vs. {1}", tOne.Area, tTwo.Area);
}

As tOne is smaller than tTwo the control flow will take the “else” path.

As the CompareTo method is by default implemented on numeric types – and strings – we can have a simpler implementation of the EqualTo method:

public int CompareTo(Triangle other)
{	
	return Area.CompareTo(other.Area);
}

We’ll soon look at a related interface, the generic IComparer of T which provides for more sophisticated ordering logic.

View all various C# language feature related posts here.

Advertisements

About Andras Nemes
I'm a .NET/Java developer living and working in Stockholm, Sweden.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

ultimatemindsettoday

A great WordPress.com site

Elliot Balynn's Blog

A directory of wonderful thoughts

Robin Sedlaczek's Blog

Developer on Microsoft Technologies

HarsH ReaLiTy

A Good Blog is Hard to Find

Softwarearchitektur in der Praxis

Wissenswertes zu Webentwicklung, Domain-Driven Design und Microservices

the software architecture

thoughts, ideas, diagrams,enterprise code, design pattern , solution designs

Technology Talks

on Microsoft technologies, Web, Android and others

Software Engineering

Web development

Disparate Opinions

Various tidbits

chsakell's Blog

Anything around ASP.NET MVC,WEB API, WCF, Entity Framework & AngularJS

Cyber Matters

Bite-size insight on Cyber Security for the not too technical.

Guru N Guns's

OneSolution To dOTnET.

Johnny Zraiby

Measuring programming progress by lines of code is like measuring aircraft building progress by weight.

%d bloggers like this: