我有List<T>
并希望以相反的顺序返回值。我不想要的是反转列表本身。
这似乎没问题,因为Reverse()
的{{1}}扩展方法完全符合我的要求。
我的问题是,IEnumerable<T>
还有Reverse()
方法,它会反转列表本身并返回void。
我知道有很多以相反顺序遍历列表的方法,但我的问题是:
如何告诉编译器我想使用同名的扩展方法?
List<T>
答案 0 :(得分:14)
明确绑定到特定扩展方法的最佳方法是使用共享方法语法调用它。在你的情况下,你会这样做:
DumpList(Enumerable.Reverse(list));
这里提到的其他一些方法的问题是它们并不总能做你想要的。例如,像这样强制转换列表:
((IEnumerable)list).Reverse()
最终可能会调用一个完全不同的方法,具体取决于您导入的命名空间,或者定义调用代码的类型。
唯一可以100%确定绑定到特定扩展方法的方法是使用共享方法语法。
答案 1 :(得分: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());
答案 2 :(得分:2)
您无需强制转换参数以选择正确的方法......您只需要更具体地说明该方法。
List<int> list = new List<int>() {1, 2, 3};
DumpList(Enumerable.Reverse(list));
答案 3 :(得分:1)
这似乎有效
var stuff = new List<int>();
var list = Enumerable.Reverse(stuff);
答案 4 :(得分:0)
如果您不介意丑陋,并且您编写了扩展方法,则可以随时致电:
MyExtensions.Reverse(list);
它仍然只是一种静态的方法。我昨天想到了这一点,当ReSharper疯了,并决定重写我的一半扩展方法作为静态方法的调用。
至于使用IEnumerable&lt; T&gt;与列表&lt; T&gt;相比,它看起来并不那么简单。我的第一个想法是使用:
IEnumerable<T>.Reverse<T>(list);
但是这给了我一个编译器错误,John的答案对于IEnumerable / List是正确的。