.Net 4.0 brought us the SortedSet:
http://msdn.microsoft.com/en-us/library/dd412070.aspx[
^]
This collection class is really handy as each item added to it is automatically placed at the appropriate location in the list so that the list remains sorted. In addition, the SortedSet handles all this with little to no affect on performance.
However, there is no extension method that allows you to write a Linq query and get the results in a SortedSet. Of course you can order a List using Linq, but the advantage of the SortedSet is that each item added to the list, before or after the Linq query is run, will automatically be placed in the correct location.
So, here's a simple extension method to return the results of a Linq query into a SortedSet:
public static SortedSet<T> ToSortedSet<T>(this IEnumerable<T> t)
{
SortedSet<T> retval = new SortedSet<T>();
t.ToList().ForEach(x => retval.Add(x));
return retval;
}
And here's a sample of using it:
static void Main(string[] args)
{
Customer cust1 = new Customer { CustomerName = "Wal Mart", CreditBalance = 525565.55M};
Customer cust2 = new Customer { CustomerName = "Ziggy's"};
Customer cust3 = new Customer { CustomerName = "Bill's Place", CreditBalance = 2545.18M };
SortedSet<Customer> customers = new SortedSet<Customer>();
customers.Add(cust1);
customers.Add(cust2);
customers.Add(cust3);
var custs = (from c in customers
select c).ToSortedSet();
custs.Add(new Customer { CustomerName = "Able's Axel Shop" });
foreach (Customer customer in custs)
Console.WriteLine(customer.CustomerName);
Console.ReadLine();
}
And finally, here's the Customer class. In the CompareTo you can decide
how the SortedSet will sort:
public class Customer : IComparable
{
public string CustomerName { get; set; }
public DateTime? DateAdded { get; set; }
public decimal? CreditBalance { get; set; }
public int CompareTo(object obj)
{
if (obj is Customer)
{
Customer c = (Customer)obj;
return CustomerName.CompareTo(c.CustomerName);
}
else
throw new ArgumentException("Object is not a Customer.");
}
}