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 (อาร์เรย์) แทน
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;

6

Reverse() ไม่ส่งคืนรายการตามที่คาดไว้สำหรับฟังก์ชันของคุณ

NavItems.Reverse();
return NavItems;

และเนื่องจากมันคืนค่าเป็นโมฆะคุณจึงไม่สามารถกำหนดให้กับ rev.
Flagbug


3

หากคุณมีรายการดังในตัวอย่างของคุณ:

List<Lite.CategoryNavItem> NavItems

คุณสามารถใช้วิธีการ Reverse <> extensions ทั่วไปเพื่อส่งคืนรายการใหม่โดยไม่ต้องแก้ไขรายการเดิม เพียงใช้วิธีการขยายดังนี้:

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

หมายเหตุ: คุณต้องระบุแท็ก <> ทั่วไปเพื่อให้ใช้เมธอดส่วนขยายอย่างชัดเจน อย่าลืม

using System.Linq;
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.