2009-06-12 70 views
9

我有一個List<T>並希望以相反的順序返回值。我不想要的是扭轉列表本身。明確使用擴展方法

這似乎沒有問題,因爲有一個Reverse()擴展方法爲IEnumerable<T>這正是我想要的。

我的問題是,也有Reverse()List<T>方法,它反轉列表本身並返回void。

我知道有很多方法來遍歷以相反的順序列表大量但我的問題是:

我怎麼告訴我要使用的擴展方法具有相同名稱的編譯器?

var list = new List<int>(new [] {1, 2, 3}); 
DumpList(list.Reverse());     // error 

回答

13

顯式綁定到特定擴展方法的最佳方式是使用共享方法語法來調用它。在你的情況,你會是這樣做:

DumpList(Enumerable.Reverse(list)); 

一些這裏提到的其他方法的問題是,他們不會永遠做你想做的。例如,鑄造名單,像這樣:

((IEnumerable)list).Reverse() 

可能最終會調用取決於什麼類型的調用代碼中定義你導入的命名空間,或完全不同的方法

的唯一途徑。 100%確定你綁定到一個特定的擴展方法是使用共享方法的語法。

+0

這是恕我直言最好的回答我的問題,所以我給它的信用。 – VVS 2009-06-12 16:51:38

9
var list = new List<int>(new [] {1, 2, 3}); 
DumpList((list as IEnumerable<int>).Reverse()); 

OR

IEnumerable<int> list = new List<int>(new [] {1, 2, 3}); 
DumpList(list.Reverse()); 
+0

哎喲,當然..時間回家:) – VVS 2009-06-12 16:13:31

0

如果你不介意的醜陋,你寫的擴展方法,您可以隨時撥打:

MyExtensions.Reverse(list); 

它仍然只是一個靜態的方法在心臟。昨天,當ReSharper瘋了,我決定將我的一半擴展方法重寫爲靜態方法的調用。

就使用IEnumerable <T>與列表<T>而言,看起來並不那麼簡單。我的第一個想法是使用:

IEnumerable<T>.Reverse<T>(list); 

但這是給我一個編譯器錯誤,約翰的答案是正確的IEnumerable /列表。

2

您不必轉換參數來選擇正確的方法......您只需要更具體地瞭解該方法。

List<int> list = new List<int>() {1, 2, 3}; 
DumpList(Enumerable.Reverse(list)); 
1

這似乎是工作

var stuff = new List<int>(); 
    var list = Enumerable.Reverse(stuff);