2009-06-12 3 views
9

У меня есть List<T> и хочу получить значения обратно в обратном порядке. Я не хочу менять сам список.Явно использую метод расширения

Это похоже на отсутствие проблем, поскольку существует способ расширения Reverse() для IEnumerable<T>, который выполняет именно то, что я хочу.

Моя проблема в том, что существует также метод Reverse() для List<T>, который отменяет сам список и возвращает пустоту.

Я знаю, что есть много способов для просмотра списка в обратном порядке, но мой вопрос:

Как сказать компилятору, что я хочу использовать метод расширения с тем же именем?

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

ответ

13

Лучший способ явного привязки к определенному методу расширения - вызывать его с использованием синтаксиса разделяемого метода. В вашем случае, вы могли бы сделать, что, как:

DumpList(Enumerable.Reverse(list)); 

Проблема с некоторыми из других подходов, упомянутых здесь является то, что они не всегда будут делать то, что вы хотите. Например, литье список, как так:

((IEnumerable)list).Reverse() 

может закончиться вызовом совершенно иной метод в зависимости от пространств имен, которые были импортированы, или какой тип вызывающий код определяется в

Единственный способ. убедитесь, что вы привязаны к определенному методу расширения, чтобы использовать синтаксис совместного использования.

+0

Это ИМХО лучший ответ на мой вопрос, так что я даю ему кредиты. – VVS

+0

Если вы не наберете полное пространство имен и имя класса, оба решения имеют одну и ту же потенциальную проблему импорта пространства имен. Так что ничто не лучше, это просто вопрос предпочтения. –

+0

Этот случай намного реже (и, как вы сказали, вы можете полностью квалифицировать имя). В общем, методы расширения предназначены для перегрузки и быть менее предпочтительными, чем методы экземпляров. Если вы пытаетесь подавить разрешение перегрузки метода расширения, тогда лучше не использовать синтаксис метода расширения. –

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

ИЛИ

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

Ouch, конечно .. время, чтобы пойти домой :) – VVS

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); 
Смежные вопросы