Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    text
    copied!<p>This console app should fix you up. The sortLamda can be of any type, which hopefully answers your question about Dynamic Content.</p> <pre><code>using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Linq.Expressions; internal class BoringEvent { public string EventStartStr { get; set; } public string EventTimeZone { get; set; } public string ProvinceState { get; set; } public string City { get; set; } public string Country { get; set; } } internal enum SortedBy { Ascending = 0, Descending } class ExpressionsTest { internal static List&lt;BoringEvent&gt; _allEvents = new List&lt;BoringEvent&gt;(); internal static class HelperFunctions { public static DateTime strToTZDateTime(string startDate, string timeZone) { //I'm too lazy to figure out dates by time zone. //Your function already has the logic, so why bother. //Let's assume the time zone is equal in this test case return DateTime.Parse(startDate); } } internal static void Main() { _allEvents.Add(new BoringEvent { EventStartStr = "12/31/1999", //let's party like it's 1999 - (yawn) I'm stuck at this event :&lt; EventTimeZone = "en-us", City = "Philadelphia", ProvinceState = "Pennsylvania", Country = "United States of America"}); _allEvents.Add(new BoringEvent { EventStartStr = "01/01/1970", EventTimeZone = "en-us", City = "New York", ProvinceState = "New York", Country = "United States of America" }); IEnumerable&lt;BoringEvent&gt; sortedEvents = null; //sort by date Console.WriteLine("Sorting Events by Ascending date..."); Expression&lt;Func&lt;BoringEvent, DateTime&gt;&gt; sortLamba = evt =&gt; HelperFunctions.strToTZDateTime(evt.EventStartStr, evt.EventTimeZone); sortedEvents = _allEvents.SortEvents(SortedBy.Ascending, sortLamba); Print(sortedEvents); //sort by country, then state, then city, then date Console.WriteLine("Sorting Events Desc by Country, then ProvinceState, then City, then Date"); Expression&lt;Func&lt;BoringEvent, object&gt;&gt;[] sortLamba2 = new Expression&lt;Func&lt;BoringEvent, object&gt;&gt;[] { evt =&gt; evt.Country, evt =&gt; evt.ProvinceState, evt =&gt; evt.City, evt =&gt; HelperFunctions.strToTZDateTime(evt.EventStartStr, evt.EventTimeZone) }; sortedEvents = _allEvents.SortEvents(SortedBy.Descending, sortLamba2); Print(sortedEvents); Console.Read(); } private static void Print(IEnumerable&lt;BoringEvent&gt; events) { for(int i = 0; i &lt; events.Count(); i++) { BoringEvent evt = events.ElementAt(i); Console.WriteLine("Event: {0}", i.ToString()); Console.WriteLine("\tEventStartStr: {0}", evt.EventStartStr); Console.WriteLine("\tEventTimeZone: {0}", evt.EventTimeZone); Console.WriteLine("\tCity: {0}", evt.City); Console.WriteLine("\tProvinceState: {0}", evt.ProvinceState); Console.WriteLine("\tCountry: {0}", evt.Country); } } } internal static class EventExtensions { public static IEnumerable&lt;TResult&gt; SortEvents&lt;TResult, T&gt;( this IEnumerable&lt;TResult&gt; events, SortedBy sortByType, params Expression&lt;Func&lt;TResult, T&gt;&gt;[] expressions) { IEnumerable&lt;TResult&gt; retVal = null; switch(sortByType) { case SortedBy.Ascending: retVal = EventExtensions.SortEventsAsc(events, expressions); break; case SortedBy.Descending: retVal = EventExtensions.SortEventsDesc(events, expressions); break; default: throw new InvalidOperationException( string.Format("The SortedBy enumeration does not contain a case for the value of '{0}'.", Enum.GetName(typeof(SortedBy), sortByType))); } return retVal; } public static IEnumerable&lt;TResult&gt; SortEventsAsc&lt;TResult, T&gt;( this IEnumerable&lt;TResult&gt; events, params Expression&lt;Func&lt;TResult, T&gt;&gt;[] expressions) { IOrderedEnumerable&lt;TResult&gt; sorted = null; for(int i = 0; i &lt; expressions.Count(); i++) { Expression&lt;Func&lt;TResult, T&gt;&gt; exp = (Expression&lt;Func&lt;TResult, T&gt;&gt;)expressions[i]; Func&lt;TResult, T&gt; deleg = exp.Compile(); if(i == 0) { sorted = events.OrderBy(evt =&gt; deleg.Invoke(evt)); } else { sorted = sorted.ThenBy(evt =&gt; deleg.Invoke(evt)); } } return sorted; } public static IEnumerable&lt;TResult&gt; SortEventsDesc&lt;TResult, T&gt;( this IEnumerable&lt;TResult&gt; events, params Expression&lt;Func&lt;TResult, T&gt;&gt;[] expressions) { IOrderedEnumerable&lt;TResult&gt; sorted = null; for (int i = 0; i &lt; expressions.Count(); i++) { Expression&lt;Func&lt;TResult, T&gt;&gt; exp = (Expression&lt;Func&lt;TResult, T&gt;&gt;)expressions[i]; Func&lt;TResult, T&gt; deleg = exp.Compile(); if (i == 0) { sorted = events.OrderByDescending(evt =&gt; deleg.Invoke(evt)); } else { sorted = sorted.ThenByDescending(evt =&gt; deleg.Invoke(evt)); } } return sorted; } } </code></pre>
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload