c # Bir listeyi tersine çevirmeye çalışma


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();
}

Tersi çalışmıyor:

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

Bunun neden olabileceğine dair bir fikriniz var mı?

Yanıtlar:


144

Deneyin:

NavItems.Reverse();
return NavItems;

List<T>.Reverse()bir bir yerinde ters; yeni bir liste döndürmez.

Bu , tersine çevrilmiş sırayı Reverse() döndüren LINQ ile çelişir , ancak uygun bir uzantı olmayan yöntem olduğunda, her zaman bir genişletme yöntemine tercih edilir. Artı, LINQ durumunda şu şekilde olmalıdır:

return someSequence.Reverse().ToList();

1
Bilginize, bir diziyi tersine çevirmek isteyenler için bu işe yaramaz, bunun yerine Array.Reverse (dizi) 'yi çağırmanız gerekir.
Iain Ward

12
Sadece ilginç bir özel durumdan muzdarip: Bir değişken olarak bildirildiğinde List<int> list, list.Reverse()yerinde sürümü çağırır. Ardından, diğer bir geliştirici ekstra akıllıdır ve bildirimi olarak değiştirir IList<int>. Bu, kodu çok beklenmedik bir şekilde bozar, çünkü o zaman IEnumerable<TSource> Reverse<TSource>(this IEnumerable<TSource> source)aşırı fonksiyon kullanılır ve bu fark
edilmez

104

Bir geçici çözüm şöyle olacaktır: Return NavItems.AsEnumerable().Reverse();


1
bu iyi ve benim durumumda işe yarıyor (orijinal listeye dokunmadan bırakın)! teşekkürler
ghiboz

20

.Reverse() bir listede, listedeki öğeleri tersine çevirir, yeni bir tersine çevrilmiş liste döndürmez.


8

Reverse()tersine çevrilmiş listeyi döndürmez, orijinal listeyi değiştirir. Öyleyse aşağıdaki gibi yeniden yazın:

return NavItems.Reverse(); 

KİME

NavItems.Reverse(); 
return NavItems;

6

Reverse() işlevinizden beklendiği gibi bir Liste döndürmez.

NavItems.Reverse();
return NavItems;

Ve void döndürdüğü için bunu rev'a atayamazsınız.
Flagbug

3

.Reverse "yerinde" ifadesini tersine çevirir ... deneyin

NavItems.Reverse();
return NavItems;

3

Örneğinizdeki gibi bir listeniz varsa:

List<Lite.CategoryNavItem> NavItems

Orijinali değiştirmeden yeni bir liste döndürmek için genel Reverse <> extensions yöntemini kullanabilirsiniz. Uzantı yöntemini şu şekilde kullanın:

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

Notlar: Uzantı yöntemini açıkça kullanmak için <> genel etiketleri belirtmeniz gerekir. Unutma

using System.Linq;
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.