2014-06-16 134 views
4

我有一個關於在C#中反轉列表元素的問題。反向<>和反向

最終目標是獲取列表的最後N個元素。

假設我有一個小數列表。

List<decimal> listOfDecimals = new List<decimal>() { 1.5m, 2.4m, 3.6m, 0.1m }; 

這是我嘗試獲取包含listOfDecimals的最後2個元素的列表。

List<decimal> listOfLastTwoElements = listOfDecimals.Reverse<decimal>().Take<decimal>(2).Reverse<decimal>().ToList<decimal>(); 

我的問題是,如果我與反向()代替反向<>(),存在如通過標記VS.一個語法錯誤

任何人都可以讓我知道什麼時候應該使用Reverse(),什麼時候使用Reverse <>()?

+0

你可以簡單地做'變種V = listOfDecimals.Skip(listOfDecimals.Count -2).ToList();' –

+0

@NikhilAgrawal感謝您的建議。但是,你還可以告訴我什麼時候應該使用一個嗎? – Roy

+1

另外,如果您想在Enumerable.Reverse '擴展名和'List .Reverse'之間消除歧義,使用'AsEnumerable '擴展名將使語法更清晰。例如,'listOfDecimals.AsEnumerable()。Reverse()。Take(2).Reverse()。ToList();'。這樣,您不必一遍又一遍地指定泛型類型參數''。 – dcastro

回答

9

這是因爲List本身有一個Reverse method。這種反向方法不會返回任何東西。

List<T>上的相反方法優先於IEnumerable<T>上的擴展方法。 令人困惑的是,當您只有IEnumerable<T>時,可以使用Reverse()而不使用類型參數。然後,編譯器的類型推斷將解析泛型類型參數。所以擴展方法看起來與List<T>上的方法相同。

var reversed1 = Enumerable.Empty<int>().Reverse(); // works 
var reversed2 = Enumerable.Empty<int>().Reverse<int>(); // works and is the same as the line above. 

var reversed3 = new List<int>().Reverse(); // does not work 
var reversed4 = new List<int>().Reverse<int>(); // works 
+0

+1。這是OP要求的。 –

0

反向()是List<T>的方法,Reverse<T>()IEnumerable<T>一個(擴展)方法,使包括List<T>

如果你想採取IEnumerable的最後2個元素,你可以做Last(2)。這將返回一個IEnumerable<T>,所以如果你想要在列表中,你必須調用ToList

List<T> also has a method `RemoveRange()`, so if you want to remove all but the last 2 elements: 

listOfDecimals.RemoveRange(0, listOfDecimals.Count - 2)