C# C# Streams and Data Processing Serialization Top Ten Scorers

Aaron Selonke
Aaron Selonke
10,323 Points

iComparible vs iComparer vs Linq

Hi there, I was pretty much a blank slate to the iComparer used in the video. After Checking out documentation and youtube videos for an hour I came to two hypothesis.

1) I tried to do this with the iComparable method first, and it was impossible because the PointsPerGame is a floating point variable. Can we get the same result with iComparable?

2) iComparer(and iComparable) are obsolete because we can call linq expressions on Lists (this is possible becuase List<t> implements the iEnumerable class).
Do I have that right?

Here is the solution (that I got from notes I took on an earlier Carling course)

public static List<Player> GetTopTenPlayers(List<Player> players)
       {
            var _Players = players.OrderByDescending(a => a.PointsPerGame).Take(10).ToList();
            return _Players;
        }

1 Answer

Steven Parker
Steven Parker
201,997 Points
  1. iComparable (or IComparer) can be used with any type of object (including floating point numbers). The restriction is that the result of the comparison function must be an integer. The video shows a good example of an iComparer being constructed that compares two Player objects. But it returns integer results.
  2. LINQ does not make iComparable (or IComparer) obsolete, but it does offer additional choices of ways to accomplish certain tasks (such as your sort solution).
Aaron Selonke
Aaron Selonke
10,323 Points

The PointsPerGame property on the Player class is a type double. The values for the different players all have decimals.
The iComparer seems to be returning double for the PointsPerGame properties for each player.

I kind of butcherd my code and completely removed the Icomparer Interface from the player class, So I won't have anything to paste here.