2014-08-28 49 views
0

我有这样的事情:如何清理我的if/else LINQ代码

 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查询不管它是什么“排序”。有什么建议么?

+1

这有什么错呢? – 2014-08-28 14:24:17

+0

这是丑陋的像废话和非常重复的 – Omid 2014-08-28 14:24:44

+1

我会建议一个开关的第一级和三元嵌套级 – 2014-08-28 14:24:55

回答

4

如果将排序逻辑移动到方法中,可以直接将谓词传递给

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); 
} 

Live demo


如果你想使用它作为一个通用的解决方案的所有列表,您可以创建它作为一个扩展方法

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); 
+0

尽管我喜欢'SortBy'方法,但您还是会掩盖原始的'sort'变量。 – Rawling 2014-08-28 14:46:17

+0

@Rawling我认为答案的重点是针对问题的症结所在。我可以更新以适应'sort'参数。 – James 2014-08-28 14:48:27

+0

@downvoter的理由? – James 2014-08-28 15:03:13