反向<>和反向

时间:2014-06-16 09:59:56

标签: c# reverse

我有一个关于在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>();

我的问题是,如果我用Reverse()替换Reverse&lt;&gt;(),则会出现由VS标记的语法错误。

任何人都可以告诉我什么时候应该使用Reverse(),何时使用Reverse&lt;&gt;()?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

Reverse()是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)