I have a situation where all of my list members have same ID (Id is string and not Integer). As part of business rules I need to sort the list in ascending order. My original implementation is quite similar to below. I was expecting to get unchanged list after applying sort as all list members have same ID but to my surprise the result is different.
Below is my original list before Sort.
Id: D1.2 Name: Pachycephalosaurus
Id: D1.2 Name: Amargasaurus
Id: D1.2 Name: Mamenchisaurus
Id: D1.2 Name: Deinonychus
Id: D1.2 Name: Coelophysis
Id: D1.2 Name: Oviraptor
Id: D1.2 Name: Tyrannosaur
Sort with alternate comparer:
Id: D1.2 Name: Pachycephalosaurus
Id: D1.2 Name: Oviraptor
Id: D1.2 Name: Coelophysis
Id: D1.2 Name: Deinonychus
Id: D1.2 Name: Mamenchisaurus
Id: D1.2 Name: Amargasaurus
Id: D1.2 Name: Tyrannosaur
Code
class Program
{
static void Main(string[] args)
{
new ComparerIssue().MainMethod();
Console.ReadKey();
}
}
internal class DinoComparer : IComparer<Dinosaur>
{
public int Compare(Dinosaur dinosaur1, Dinosaur dinosaur2)
{
return Compare(dinosaur1.Id, dinosaur2.Id);
}
private int Compare(string x, string y)
{
if (x == y)
{
return 1; //I have tried using 1 and 0; -1 throws exception
}
return x.CompareTo(y);
}
}
public class ComparerIssue
{
public void MainMethod()
{
List<Dinosaur> dinosaurs = new List<Dinosaur>();
dinosaurs.Add(new Dinosaur() { Id = "D1.2", Name = "Pachycephalosaurus" });
dinosaurs.Add(new Dinosaur() { Id = "D1.2", Name = "Amargasaurus" });
dinosaurs.Add(new Dinosaur() { Id = "D1.2", Name = "Mamenchisaurus" });
dinosaurs.Add(new Dinosaur() { Id = "D1.2", Name = "Deinonychus" });
dinosaurs.Add(new Dinosaur() { Id = "D1.2", Name = "Coelophysis" });
dinosaurs.Add(new Dinosaur() { Id = "D1.2", Name = "Oviraptor" });
dinosaurs.Add(new Dinosaur() { Id = "D1.2", Name = "Tyrannosaur" });
Display(dinosaurs);
DinoComparer dc = new DinoComparer();
Console.WriteLine("\nSort with alternate comparer:");
dinosaurs.Sort(dc);
Display(dinosaurs);
}
private static void Display(IEnumerable<Dinosaur> list)
{
Console.WriteLine();
foreach (Dinosaur dinosaur in list)
{
Console.WriteLine("Id: " + dinosaur.Id + " Name: " + dinosaur.Name);
}
}
}
public class Dinosaur
{
public string Id { get; set; }
public string Name { get; set; }
}