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
참고로 배열을 반전하려는 사람들은 작동하지 않으므로 대신 Array.Reverse (array)를 호출해야합니다.
이안 구

11
흥미로운 특수한 경우가 있습니다. 변수가으로 선언되면 인플레 이스 버전 List<int> listlist.Reverse()호출합니다. 그런 다음 동료 개발자가 더 똑똑하고 선언을 IList<int>. 이것은 함수 IEnumerable<TSource> Reverse<TSource>(this IEnumerable<TSource> source)오버로드가 사용 되기 때문에 매우 예상치 못한 방식으로 코드를 깨뜨리고 이것은 눈에 띄지 않게됩니다. 사용되지 않은 반환 값을 관찰해야합니다. C #
Cee McSharpface

103

한 가지 해결 방법은 다음과 같습니다. Return NavItems.AsEnumerable().Reverse();


1
그것은 좋고 내 경우에 작동합니다 (원래 목록은 그대로 두십시오)! 감사
ghiboz

20

.Reverse() on a list는 목록 내의 항목을 반전하지만 새 반전 된 목록을 반환하지 않습니다.


8

Reverse()반전 된 목록 자체를 반환하지 않고 원래 목록을 수정합니다. 따라서 다음과 같이 다시 작성하십시오.

return NavItems.Reverse(); 

NavItems.Reverse(); 
return NavItems;

6

Reverse() 함수의 예상대로 목록을 반환하지 않습니다.

NavItems.Reverse();
return NavItems;

그리고 void를 반환하기 때문에 rev에 할당 할 수 없습니다.
Flagbug 2011-08-08

3

.Reverse "in-place"를 뒤집습니다 ..., 시도

NavItems.Reverse();
return NavItems;

2

예와 같은 목록이있는 경우 :

List<Lite.CategoryNavItem> NavItems

일반 Reverse <> 확장 메서드를 사용하여 원래 목록을 수정하지 않고 새 목록을 반환 할 수 있습니다. 다음과 같은 확장 방법을 사용하십시오.

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

참고 : 확장 메서드를 명시 적으로 사용하려면 <> 일반 태그를 지정해야합니다. 잊지 마세요

using System.Linq;
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.