Sunday, October 19, 2014

Sorting a collection using Linq and 'SortExpression' string

Sorting a collection using Linq and 'SortExpression' string

Already happened to you that you had a collection of object from type 'X' with some properties, and you had to sort it one time by property 'ID', and another time by property 'Name' ? You wished that you can sort it by just using a 'Sort Expression' ? If still not, I'm sure this moment will arrive sooner or later. Let me save you some time and an headache.
This is how it can be done: 
 public static IEnumerable<T> Sort<T>(this IEnumerable<T> source, string sortExpression)
{
    string[] sortParts = sortExpression.Split(' ');
    var param = Expression.Parameter(typeof(T), string.Empty);
    try
    {
        var property = Expression.Property(param, sortParts[0]);
        var sortLambda = Expression.Lambda<Func<T, object>>(Expression.Convert(property, typeof(object)), param);

        if (sortParts.Length > 1 && sortParts[1].Equals("desc", StringComparison.OrdinalIgnoreCase))
        {
            return source.AsQueryable<T>().OrderByDescending<T, object>(sortLambda);
        }
        return source.AsQueryable<T>().OrderBy<T, object>(sortLambda);
    }
    catch (ArgumentException)
    {
        return source;
    }
}
Just drop it in a static class, and you will be able to sort any collection that implement the interface IEnumerable.
Lets say you have a class 'User':
public class User
{
    public int ID { get; set; }
    public string Name { get; set; }
}
and a List<User> collection: users. You can sort it however you want:
IEnumerable<User> sortedUsersIEnumerable = users.Sort<User>("ID desc"); 
Or
List<User> sortedUsersList = users.Sort<User>("Name").ToList();
I really think this extension should be 'built-in' part of the 'Linq'. 

No comments:

Post a Comment