To order a Queue:
var rooms = new Queue<Rooms>();
var orderByNumberAsc = rooms.OrderBy(r => r.Number);
var orderByNumberDesc = rooms.OrderByDescending(r => r.Number);
To dynamically order this based on string you need an extension:
public static IQueryable<T> OrderBy<T>(this IQueryable<T> items, string propertyName)
{
var typeOfT = typeof(T);
var parameter = Expression.Parameter(typeOfT, "parameter");
var propertyType = typeOfT.GetProperty(propertyName).PropertyType;
var propertyAccess = Expression.PropertyOrField(parameter, propertyName);
var orderExpression = Expression.Lambda(propertyAccess, parameter);
var expression = Expression.Call(typeof(Queryable), "OrderBy", new[] { typeOfT, propertyType }, items.Expression, Expression.Quote(orderExpression));
return items.Provider.CreateQuery<T>(expression);
}
Then you can order by a string value:
var rooms = new Queue<Rooms>().AsQueryable();
var orderByNumberAsc = rooms.OrderBy("Number");
And you could easy create an extension for
OrderByDescending(string propertyName)
Or a little less dynamic approach using switch statement:
switch (orderByParam)
{
case "Number":
rooms = rooms.OrderBy(r => r.Number);
break;
case "Capacity":
rooms = rooms.OrderBy(r => r.Capacity);
break;
}