2011-04-13 223 views
2

問候C#Linq在擴展/方法

我正在尋找創建一個包括linq查詢的擴展方法。 我正在尋找的是既可以做這樣的事情

var orderedList = OrderThisList<ModelName>(List<T> sourceList, //and something like m=>m.Username); 

哪裏MODELNAME是實體和用戶名是我要訂購該領域的方法或擴展方法。 該方法看起來像

public List<T> OrderThisList<T>(//some linq property?) 
{ 
    //What code goes here? 
} 
+0

數據意味着來自哪裏? – 2011-04-13 06:39:11

+0

好問題!編輯 – 2011-04-13 06:45:15

+0

如果您已經通過'List ',爲什麼不直接使用'OrderBy'?或者你是否試圖對列表進行排序?請澄清你的問題。 – 2011-04-13 06:46:38

回答

3

編輯:它仍然非常模糊,這個問題是什麼一回事,但它聽起來就像我們在內存中的集合,而不是處理LINQ到SQL等

如果使用OrderBy問題它不會就地對列表進行排序,您應該使用List<T>.Sort(),可能會傳入自定義比較器。

我的MiscUtil項目有幾個幫助類型,可以幫助你。例如:

var comparison = ProjectionComparer<ModelType>.Create(m => m.SomeProperty) 
               .ThenBy(m => m.SomeOtherProperty); 
list.Sort(comparison); 

如果你正在使用LINQ to SQL,你已經有了一個data context,你可以使用:

public List<TSource, TKey> OrderThisList<TSource, TKey>(
    Expression<Func<TSource, TKey>> ordering) 
{ 
    return dataContext.GetTable<TSource>() 
         .OrderBy(ordering) 
         .ToList(); 
} 

現在很明顯,需要類型參數,而你只想指定一個。有很多種方法 - 基本上你最終需要一個通用類型和一個方法一個類型參數(TKey)可以推斷。例如:

var list = Orderer<ModelType>.Create(dataContext) 
          .OrderThisList(m => m.SomeProperty); 

這有點圓這房子雖然考慮到OrderBy已經可用...你能解釋一下你爲什麼要這樣,也什麼LINQ提供程序參與?

+0

我正在尋找一種方法將50行訂購代碼轉換爲更小的代碼。 – 2011-04-13 06:46:52

+2

@Levisaxos:如果沒有真正瞭解這50行訂購代碼的用途,很難爲您提供幫助。請閱讀http://tinyurl.com/so-hints – 2011-04-13 06:47:38

+0

謝謝,但我不能提供所有的細節,因爲抄寫。這幫助我現在! – 2011-04-13 06:49:49

2

你應該使用內置的LINQ的方法var orderedList = myList.OrderBy(x => x.Username)你不應該需要編寫自己的擴展方法來排序列表。

+0

我應該,但我不會,所以這不回答我的問題! – 2011-04-13 06:44:21

+3

@Levisaxos:但是*爲什麼*你不會?如果答案對你沒有幫助,你應該解釋原因,以便給出其他答案,這將會更有幫助。目前這就像玩「猜猜我在想哪個號碼」。 – 2011-04-13 06:52:27