using System.Collections.Generic;
public static void Main()
var Foos = Enumerable.Range(0, 10).Select(x => new Foo
Console.WriteLine("### BASIC DEMO ###");
var order1 = new[] { "prop1", "prop2", "prop3", "prop4" };
var result1 = DynamicalSort(Foos, order1);
Console.Write("\n\nOrder1 => ");
Console.WriteLine( string.Join(", ", result1.Select(o=> o.ID))) ;
var order2 = new[] { "prop4", "prop1", "prop2", "prop3" };
var result2 = DynamicalSort(Foos, order2);
Console.Write("\n\nOrder2 => ");
Console.WriteLine(string.Join(", ", result2.Select(o => o.ID)));
Console.WriteLine("\n\n");
Console.WriteLine("### Generic DEMO ###");
var order3 = new[] { "prop1", "prop2", };
var result3 = Foos.OrderByPropertiesNames(order3);
Console.Write("\n\nOrder3 => ");
Console.WriteLine(string.Join(", ", result3.Select(o => o.ID)));
var order4 = new[] { "prop4", "prop1", };
var result4 = Foos.OrderByPropertiesNames(order4);
Console.Write("\n\nOrder4 =>");
Console.WriteLine(string.Join(", ", result4.Select(o => o.ID)));
public static List<Foo> DynamicalSort(IEnumerable<Foo> source, IEnumerable<string> orderList)
IOrderedEnumerable<Foo> ordered = source.OrderBy(o => o.ID);
switch (orderList.First())
ordered = source.OrderBy(o => o.prop1);
ordered = source.OrderBy(o => o.prop2);
ordered = source.OrderBy(o => o.prop3);
ordered = source.OrderBy(o => o.prop4);
foreach (var order in orderList.Skip(1))
ordered = ordered.ThenBy(o => o.prop1);
ordered = ordered.ThenBy(o => o.prop2);
ordered = ordered.ThenBy(o => o.prop3);
ordered = ordered.ThenBy(o => o.prop4);
public int ID { get; set; }
public int prop1 { get; set; }
public int prop2 { get; set; }
public int prop3 { get; set; }
public int prop4 { get; set; }
public static class Extention
public static IOrderedEnumerable<T> OrderByPropertyName<T>(this IEnumerable<T> source, string propertyName)
var property = typeof(T).GetProperty(propertyName);
if (property == null) return (IOrderedEnumerable<T>)source;
else return source.OrderBy(x => property.GetValue(x));
public static IOrderedEnumerable<T> ThenByPropertyName<T>(this IOrderedEnumerable<T> source, string propertyName)
var property = typeof(T).GetProperty(propertyName);
if (property == null) return source;
else return source.ThenBy(x => property.GetValue(x));
public static List<T> OrderByPropertiesNames<T>(this IEnumerable<T> source, IEnumerable<string> propertyName)
var firstOrder = propertyName.First();
var ordered = source.OrderByPropertyName(firstOrder);
foreach (var order in propertyName.Skip(1))
ordered = ordered.ThenByPropertyName(order);