c # Попытка перевернуть список

91
public class CategoryNavItem
{
    public int ID { get; set; }
    public string Name { get; set; }
    public string Icon { get; set; }

    public CategoryNavItem(int CatID, string CatName, string CatIcon)
    {
        ID = CatID;
        Name = CatName;
        Icon = CatIcon;
    }
}

public static List<Lite.CategoryNavItem> getMenuNav(int CatID)
{
    List<Lite.CategoryNavItem> NavItems = new List<Lite.CategoryNavItem>();

    -- Snipped code --

    return NavItems.Reverse();
}

Обратное не работает:

Error 3 Cannot implicitly convert type 'void' to 'System.Collections.Generic.List<Lite.CategoryNavItem>'

Есть идеи, почему это может быть?

Том Галлен
источник

Ответы:

144

Пытаться:

NavItems.Reverse();
return NavItems;

List<T>.Reverse()это на месте обратный; он не возвращает новый список.

Это действительно отличается от LINQ, где Reverse() возвращается обратная последовательность, но когда есть подходящий метод без расширения, он всегда выбирается вместо метода расширения. Кроме того, в случае LINQ это должно быть:

return someSequence.Reverse().ToList();
Марк Гравелл
источник
1
FYI для тех, кто хочет перевернуть массив, это не работает, вам нужно вместо этого вызвать Array.Reverse (array).
Iain Ward
12
Просто пострадал от интересного особого случая: когда переменная объявляется как List<int> list, то list.Reverse()вызывает версию на месте. Затем другой разработчик проявляет особую смекалку и меняет объявление на IList<int>. Это очень неожиданно нарушает код, потому что тогда используется IEnumerable<TSource> Reverse<TSource>(this IEnumerable<TSource> source)перегрузка функции , и это остается незамеченным - вам придется следить за неиспользованным возвращаемым значением, а это редко практикуется в C #
Cee McSharpface
104

Один обходной путь был бы Return NavItems.AsEnumerable().Reverse();

Мафу Джош
источник
1
это хорошо и работает в моем случае (оставьте исходный список нетронутым)! спасибо
ghiboz
20

.Reverse() в списке меняет местами элементы в списке, он не возвращает новый перевернутый список.

Кирен Джонстон
источник
8

Reverse()не возвращает сам обратный список, он изменяет исходный список. Так что перепишите его следующим образом:

return NavItems.Reverse(); 

К

NavItems.Reverse(); 
return NavItems;
sll
источник
6

Reverse() не возвращает список, как ожидалось от вашей функции.

NavItems.Reverse();
return NavItems;
JK.
источник
И поскольку он возвращает void, вы не можете присвоить его rev.
Flagbug
3

.Reverse меняет местами "на месте" ... попробуйте

NavItems.Reverse();
return NavItems;
Яхья
источник
3

Если у вас есть список, как в вашем примере:

List<Lite.CategoryNavItem> NavItems

Вы можете использовать общий метод расширений Reverse <>, чтобы вернуть новый список, не изменяя исходный. Просто используйте такой метод расширения:

List<Lite.CategoryNavItem> reversed = NavItems.Reverse<Lite.CategoryNavItem>();

Примечания. Чтобы явно использовать метод расширения, необходимо указать общие теги <>. Не забывайте

using System.Linq;
MLH
источник