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


8

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

return NavItems.Reverse(); 

К

NavItems.Reverse(); 
return NavItems;

6

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

NavItems.Reverse();
return NavItems;

И поскольку он возвращает 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;
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.