2014-08-28 21 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