c # Спроба змінити список назад


90
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>'

Будь-які ідеї, чому це може бути?

Відповіді:


143

Спробуйте:

NavItems.Reverse();
return NavItems;

List<T>.Reverse()є реверсом на місці ; він не повертає новий список.

Це робить контраст з LINQ, де Reverse() повертається в зворотній послідовності, але коли є відповідний спосіб без розширення він завжди вибирається в перевагу методу розширення. Плюс, у випадку LINQ це повинно бути:

return someSequence.Reverse().ToList();

1
FYI для тих, хто хоче повернути масив назад, це не працює, натомість потрібно викликати Array.Reverse (масив).
Iain Ward

11
Просто постраждав від цікавого особливого випадку: коли змінна оголошується як List<int> list, тоді list.Reverse()викликає версію на місці. Потім колега-розробник дуже розумний і змінює декларацію на IList<int>. Це розбиває код дуже несподівано, оскільки тоді використовується IEnumerable<TSource> Reverse<TSource>(this IEnumerable<TSource> source)перевантаження функції , і це залишається непоміченим - вам доведеться стежити за невикористаним значенням повернення, і це рідко практикується в C #
Cee McSharpface

103

Одним з обхідних шляхів було б Return NavItems.AsEnumerable().Reverse();


1
це добре і працює в моєму випадку (залиште вихідний список недоторканим)! спасибі
ghiboz


8

Reverse()не повертає сам сторнутий список, він змінює оригінальний список. Тож перепишіть його наступним чином:

return NavItems.Reverse(); 

ДО

NavItems.Reverse(); 
return NavItems;

6

Reverse() не повертає список, як очікувалося від вашої функції.

NavItems.Reverse();
return NavItems;

І оскільки воно повертається недійсним, ви не можете призначити його для rev.
Flagbug

3

.Reverse змінює "на місці" ..., спробуйте

NavItems.Reverse();
return NavItems;

2

Якщо у вас є список, як у вашому прикладі:

List<Lite.CategoryNavItem> NavItems

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

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

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

using System.Linq;
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.