我的代码的行部分是重复的.
您将看到下面的lambda表达式重复4次
x => x.GetValue<string>("City")).ThenByDescending(x => HelperFunctions.strToTZDateTime(x.GetValue<string>("EventStartStr"),x.GetValue<string[]>("EventTimeZone")[0].ToString())
代码示例:
//SORT DATA switch (SortDetails) { case ("Date"): default: if (SortOrder == "ASC") { _allEvents = _allEvents.OrderBy(x => HelperFunctions.strToTZDateTime(x.GetValue<string>("EventStartStr"),x.GetValue<string[]>("EventTimeZone")[0].ToString())); } else { _allEvents = _allEvents.OrderByDescending(x => HelperFunctions.strToTZDateTime(x.GetValue<string>("EventStartStr"),x.GetValue<string[]>("EventTimeZone")[0].ToString())); } break; case ("Location"): if (SortOrder == "ASC") { _allEvents = _allEvents.OrderBy(x => x.GetValue<string>("Country")).ThenBy(x => x.GetValue<string>("ProvinceState")).ThenBy(x => x.GetValue<string>("City")).ThenBy(x => HelperFunctions.strToTZDateTime(x.GetValue<string>("EventStartStr"),x.GetValue<string[]>("EventTimeZone")[0].ToString())); } else { _allEvents = _allEvents.OrderByDescending(x => x.GetValue<string>("Country")).ThenByDescending(x => x.GetValue<string>("ProvinceState")).ThenByDescending(x => x.GetValue<string>("City")).ThenByDescending(x => HelperFunctions.strToTZDateTime(x.GetValue<string>("EventStartStr"),x.GetValue<string[]>("EventTimeZone")[0].ToString())); } break; }
我想采取第一行,并使其成为我可以进入OrderBy的东西.
就像是 :
System.Linq.Expressions.Expression<Func<DynamicContent,DateTime>> sortLambda = x => HelperFunctions.strToTZDateTime(x.GetValue<string>("EventStartStr"),x.GetValue<string[]>("EventTimeZone")[0].ToString());
进入:
allEvents = _allEvents.OrderBy(sortLambda);
不幸的是,这似乎并没有奏效.
解决方法
这个控制台应用程序应该修复你. sortLamda可以是任何类型,希望能回答有关动态内容的问题.
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<BoringEvent> _allEvents = new List<BoringEvent>(); 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 :< 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<BoringEvent> sortedEvents = null; //sort by date Console.WriteLine("Sorting Events by Ascending date..."); Expression<Func<BoringEvent,DateTime>> sortLamba = evt => 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<Func<BoringEvent,object>>[] sortLamba2 = new Expression<Func<BoringEvent,object>>[] { evt => evt.Country,evt => evt.ProvinceState,evt => evt.City,evt => HelperFunctions.strToTZDateTime(evt.EventStartStr,evt.EventTimeZone) }; sortedEvents = _allEvents.sortEvents(SortedBy.Descending,sortLamba2); Print(sortedEvents); Console.Read(); } private static void Print(IEnumerable<BoringEvent> events) { for(int i = 0; i < 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<TResult> SortEvents<TResult,T>( this IEnumerable<TResult> events,SortedBy sortByType,params Expression<Func<TResult,T>>[] expressions) { IEnumerable<TResult> 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<TResult> SortEventsAsc<TResult,T>>[] expressions) { IOrderedEnumerable<TResult> sorted = null; for(int i = 0; i < expressions.Count(); i++) { Expression<Func<TResult,T>> exp = (Expression<Func<TResult,T>>)expressions[i]; Func<TResult,T> deleg = exp.Compile(); if(i == 0) { sorted = events.OrderBy(evt => deleg.Invoke(evt)); } else { sorted = sorted.ThenBy(evt => deleg.Invoke(evt)); } } return sorted; } public static IEnumerable<TResult> SortEventsDesc<TResult,T>>[] expressions) { IOrderedEnumerable<TResult> sorted = null; for (int i = 0; i < expressions.Count(); i++) { Expression<Func<TResult,T> deleg = exp.Compile(); if (i == 0) { sorted = events.OrderByDescending(evt => deleg.Invoke(evt)); } else { sorted = sorted.ThenByDescending(evt => deleg.Invoke(evt)); } } return sorted; } }
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。