c# – System.Linq.Expressions.Expression for .OrderBy函数
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – System.Linq.Expressions.Expression for .OrderBy函数,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含5916字,纯文字阅读大概需要9分钟。
内容图文
![c# – System.Linq.Expressions.Expression for .OrderBy函数](/upload/InfoBanner/zyjiaocheng/770/465954413b7d429fb17d4a3d5cf6ed5e.jpg)
我的代码的行部分是重复的.
您将看到下面的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>(
this IEnumerable<TResult> events,
params Expression<Func<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>(
this IEnumerable<TResult> events,
params Expression<Func<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.OrderByDescending(evt => deleg.Invoke(evt));
}
else
{
sorted = sorted.ThenByDescending(evt => deleg.Invoke(evt));
}
}
return sorted;
}
}
内容总结
以上是互联网集市为您收集整理的c# – System.Linq.Expressions.Expression for .OrderBy函数全部内容,希望文章能够帮你解决c# – System.Linq.Expressions.Expression for .OrderBy函数所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。