I'm fond of defensive programming. I hate exception throwing, but this is not the subject of my question.
I adapted an extension to linQ to be able to perform an order by with a column name
public static IEnumerable<T> OrderBy<T>(this IEnumerable<T> list, string sortExpression)
With defensive programming, this method returns the given enumerable if the column name is not valid.
Now I need to perform a secondary sorting with ThenBy. So I need that signature :
public static IOrderedEnumerable<T> OrderBy<T>(this IEnumerable<T> list, string sortExpression)
I need to return a IOrderedEnumerable. My problem is to keep my defensive programming feature : I must return the given set is the column name is invalid.
Is there a clean way to do this ? All I'm thinking of are kind of tricks :
- Use reflection to order by the first found property, which is risky because the property may not be sorting-allowed
- Implement my own IOrderedEnumerable, which is risky too because I perform ordering on IQueryable or IList, then I perform other LinQ operations, so I fear side effects.
And advice / suggestion ? Thanks
You may do any ordering. If column doesn't exist, just leave your input enumerable as it was before. To do this, create key selector that returns the same value for all elements.
See example: