C# 如何清理我的if/else LINQ代码
我有这样的想法:C# 如何清理我的if/else LINQ代码,c#,linq,C#,Linq,我有这样的想法: if (sort == "Customer") { if (sortDirection == SortDirection.Descending) myList = myList.OrderByDescending(e => e.SiteOrganization.Organization.Name).ToList(); else m
if (sort == "Customer")
{
if (sortDirection == SortDirection.Descending)
myList = myList.OrderByDescending(e => e.SiteOrganization.Organization.Name).ToList();
else
myList = myList.OrderBy(e => e.SiteOrganization.Organization.Name).ToList();
}
if (sort == "RequestType")
{
if (sortDirection == SortDirection.Descending)
myList = myList.OrderByDescending(e => e.TypeId).ToList();
else
myList = myList.OrderBy(e => e.TypeId).ToList();
}
if (sort == "RequestedByShort")
{
if (sortDirection == SortDirection.Descending)
myList = myList.OrderByDescending(e => e.RequestedByUser.ShortName).ToList();
else
myList = myList.OrderBy(e => e.RequestedByUser.ShortName).ToList();
}
我想把这个清理一下
if (sortDirection == SortDirection.Descending)
myList = myList.OrderByDescending(e => e.RequestedByUser.ShortName).ToList();
else
myList = myList.OrderBy(e => e.RequestedByUser.ShortName).ToList();
所以我只有一个LINQ查询,不管它是什么“排序”。有什么建议吗?如果您将排序逻辑移动到一个方法中,您可以直接传入谓词,例如
public IList<TSource> SortBy<TSource, TMember>(IEnumerable<TSource> list, Func<TSource, TMember> selector, SortDirection direction)
{
if (direction == SortDirection.Descending)
return list.OrderByDescending(selector).ToList();
else
return list.OrderBy(selector).ToList();
}
...
if (sort == "Customer") {
list = SortBy(list, x => x.SiteOrganization.Organization.Name, SortDirection.Descending);
} else if (sort == "RequestType") {
list = SortBy(list, x => x.TypeId, SortDirection.Ascending);
} else if (sort == "RequestedByShort") {
list = SortBy(list, x => x.RequestedByUser.ShortName, SortDirection.Descending);
}
public IList SortBy(IEnumerable列表、Func选择器、SortDirection方向)
{
if(方向==排序方向.下降)
return list.OrderByDescending(选择器).ToList();
其他的
return list.OrderBy(selector.ToList();
}
...
如果(排序=“客户”){
list=SortBy(list,x=>x.SiteOrganization.Organization.Name,SortDirection.Descending);
}else if(排序==“请求类型”){
list=SortBy(list,x=>x.TypeId,SortDirection.升序);
}else if(sort==“RequestedByShort”){
list=SortBy(list,x=>x.RequestedByUser.ShortName,SortDirection.Descending);
}
如果您想将其用作所有列表的通用解决方案,可以将其创建为扩展方法
public static class ListExt
{
public static IList<TSource> SortBy<TSource, TMember>(this IEnumerable<TSource> list, Func<TSource, TMember> selector, SortDirection direction)
{
if (direction == SortDirection.Descending) {
return list.OrderByDescending(selector).ToList();
} else {
return list.OrderBy(selector).ToList();
}
}
}
...
list = list.SortBy(x => x.TypeId, SortDirection.Ascending);
公共静态类listex
{
公共静态IList排序(此IEnumerable列表、Func选择器、排序方向)
{
if(方向==排序方向.下降){
return list.OrderByDescending(选择器).ToList();
}否则{
return list.OrderBy(selector.ToList();
}
}
}
...
list=list.SortBy(x=>x.TypeId,SortDirection.升序);
如果将排序逻辑移动到方法中,则可以直接将谓词传入,例如
public IList<TSource> SortBy<TSource, TMember>(IEnumerable<TSource> list, Func<TSource, TMember> selector, SortDirection direction)
{
if (direction == SortDirection.Descending)
return list.OrderByDescending(selector).ToList();
else
return list.OrderBy(selector).ToList();
}
...
if (sort == "Customer") {
list = SortBy(list, x => x.SiteOrganization.Organization.Name, SortDirection.Descending);
} else if (sort == "RequestType") {
list = SortBy(list, x => x.TypeId, SortDirection.Ascending);
} else if (sort == "RequestedByShort") {
list = SortBy(list, x => x.RequestedByUser.ShortName, SortDirection.Descending);
}
public IList SortBy(IEnumerable列表、Func选择器、SortDirection方向)
{
if(方向==排序方向.下降)
return list.OrderByDescending(选择器).ToList();
其他的
return list.OrderBy(selector.ToList();
}
...
如果(排序=“客户”){
list=SortBy(list,x=>x.SiteOrganization.Organization.Name,SortDirection.Descending);
}else if(排序==“请求类型”){
list=SortBy(list,x=>x.TypeId,SortDirection.升序);
}else if(sort==“RequestedByShort”){
list=SortBy(list,x=>x.RequestedByUser.ShortName,SortDirection.Descending);
}
如果您想将其用作所有列表的通用解决方案,可以将其创建为扩展方法
public static class ListExt
{
public static IList<TSource> SortBy<TSource, TMember>(this IEnumerable<TSource> list, Func<TSource, TMember> selector, SortDirection direction)
{
if (direction == SortDirection.Descending) {
return list.OrderByDescending(selector).ToList();
} else {
return list.OrderBy(selector).ToList();
}
}
}
...
list = list.SortBy(x => x.TypeId, SortDirection.Ascending);
公共静态类listex
{
公共静态IList排序(此IEnumerable列表、Func选择器、排序方向)
{
if(方向==排序方向.下降){
return list.OrderByDescending(选择器).ToList();
}否则{
return list.OrderBy(selector.ToList();
}
}
}
...
list=list.SortBy(x=>x.TypeId,SortDirection.升序);
有什么问题吗?它像垃圾一样难看,而且非常重复。我建议第一级切换,嵌套级切换三元level@Omid字体但是很清楚。你可以看看这个动态的方法:myList
是IQueryable
还是IEnumerable
?有什么问题吗?它像垃圾一样丑陋,而且非常重复。我建议第一级切换,嵌套级切换三元level@Omid字体但是很清楚。你可以看看这个动态的方法:myList
是IQueryable
还是IEnumerable
?虽然我喜欢SortBy
方法,但你有点掩盖了原来的sort
变量。@Rawling我想答案的重点是针对问题的症结所在。我也可以更新以适应sort
参数。我不是,但我刚刚注意到您只将一个泛型参数传递给两个泛型参数方法。+1表示所有列表的通用解决方案。在阅读了你的前半部分答案后,我打算自己发布一个。@Rawling第二个泛型参数是由谓词隐含的,因此它不是必需的。事实上,这都是隐含的,所以我不需要在思考的时候传递任何论点。Neolik是的,在写下答案后,我意识到它足够通用,可以重复使用,我还认为SortDirection
enum可以简化为asc
bool(除非OP有其他排序条件)。尽管我喜欢SortBy
方法,您有点忽略了原始的sort
变量。@Rawling我想答案的重点是针对问题的症结所在。我也可以更新以适应sort
参数。我不是,但我刚刚注意到您只将一个泛型参数传递给两个泛型参数方法。+1表示所有列表的通用解决方案。在阅读了你的前半部分答案后,我打算自己发布一个。@Rawling第二个泛型参数是由谓词隐含的,因此它不是必需的。事实上,这都是隐含的,所以我不需要在思考的时候传递任何论点。Neolik是的,在写下答案后,我意识到它足够通用,可以重复使用,我还认为SortDirection
enum可以简化为asc
bool(除非OP有其他排序条件)。