Sometimes you have a list of objects you want to stay sorted. You can usually use an IList and then linq: orderby to sort the list – but other times it helps to have the list always sorted. In those times, SortedSet works very well. In my below example, a sorted set contains some people – and whenever you look at the list in the SortedSet – they are already sorted (by age, name & location).
I was concerned about the performance of the SortedSet vs. a List, so after running some tests, as expected – the SortedSet needs some initial time when adding items (to compare) vs. the List which will is fast to write to – but needs a little time when sorting the list after. Below is some really fast numbers (data in milliseconds) I’ve compiled based on adding / reading 25000 records:
Below is the sample using SortedSet and an IComparer:
using System; using System.Collections.Generic; namespace sortedSet { internal class Program { private static void Main(string[] args) { //create the SortedSet SortedSet<Person> people = new SortedSet<Person>(new PersonComparer()); //add some random folks: Random rnd = new Random(); for (int i = 1; i <= 25; i++) { //new person Person person = new Person(); person.name = "Bob " + i.ToString(); person.location = "Miami" + i.ToString(); //random age int r = rnd.Next(1, 99); person.age = r; //add person to set people.Add(person); } //show our list: foreach (Person person in people) { Console.WriteLine(person.name + " - Age: " + person.age.ToString()); } Console.ReadLine(); } } //create comparer internal class PersonComparer : IComparer<Person> { public int Compare(Person x, Person y) { //first by age int result = x.age.CompareTo(y.age); //then name if (result == 0) result = x.name.CompareTo(y.name); //a third sort if (result == 0) result = x.location.CompareTo(y.location); return result; } } internal class Person { public string name { get; set; } public string location { get; set; } public int age { get; set; } } }
-If you don’t have a need to sort your lists – don’t forget about HashSet (very fast).