2014-06-16 82 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)