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有其他排序条件)。