About the author

Miron Abramson
Me
Software Engineer,
CTO at PixeliT
and .NET addicted for long time.
Open source projects:
MbCompression - Compression library

Recent comments

Authors

Disclaimer

The opinions expressed herein are my own personal opinions and do not represent my employer's view in anyway.

© Copyright 2009

Creative Commons License

Blog Flux Directory
Technology Blogs - Blog Top Sites

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'. 

Extensions.cs (1.08 kb)

Currently rated 4.7 by 6 people

  • Currently 4.666667/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Categories: ASP.NET | C# | Server side
Posted by Miron on Wednesday, May 07, 2008 1:59 PM
Permalink | Comments (7) | Post RSSRSS comment feed

Related posts

Comments

Bart Czernicki us

Thursday, May 08, 2008 10:33 AM

Bart Czernicki

Very nice. I wrote something like this for a tool I was writing for dynamically interactive grids (bind to any data source and you get sorting/filtering etc) all out of the box.

dave us

Tuesday, July 29, 2008 1:24 AM

dave

very cool! This and the PredicateBuilder (www.albahari.com/nutshell/predicatebuilder.html ) make LINQ virtually unstoppable for databinding asp.net grids and filtering.

ps Something is wrong with your url parsing script it's messing the pasted link all up if I put my own 'http' in front of it.

Minal nz

Monday, February 23, 2009 3:35 PM

Minal

Very neat.
You just saved me re-inventing your wheel Smile

Thanks a million.

Jason us

Friday, March 27, 2009 12:47 PM

Jason

thanks a lot! this helped me a ton

koo us

Sunday, March 29, 2009 10:24 AM

koo

thanks for your sharing and waiting to read future post.

Belajar Para Pemula us

Monday, June 15, 2009 4:47 AM

Belajar Para Pemula

It does save my time..
and without headache as well

coral gables real estate us

Monday, June 29, 2009 4:24 PM

coral gables real estate

This is simple. You surely saved an headache. Thanks for the script man.

Add comment


(Will show your Gravatar icon)  

  Country flag





Live preview

Friday, July 03, 2009 9:50 PM