일반 목록 DESC 및 ASC를 어떻게 정렬 할 수 있습니까?


110

일반 목록 DESC 및 ASC를 어떻게 정렬 할 수 있습니까? LINQ가 있고 LINQ가 없습니까? VS2008을 사용하고 있습니다.

class Program
{
    static void Main(string[] args)
    {
        List<int> li = new List<int>();

        li.Add(456);
        li.Add(123);
        li.Add(12345667);
        li.Add(0);
        li.Add(1);

        li.Sort();

        foreach (int item in li)
        {
            Console.WriteLine(item.ToString() + "\n");
        }

        Console.ReadKey();
    }
}

답변:


246

Linq와 함께

var ascendingOrder = li.OrderBy(i => i);
var descendingOrder = li.OrderByDescending(i => i);

Linq없이

li.Sort((a, b) => a.CompareTo(b)); // ascending sort
li.Sort((a, b) => b.CompareTo(a)); // descending sort

Linq가 없으면 목록 자체가 정렬됩니다. Linq를 사용하면 목록의 열거 가능한 순서가 표시되지만 목록 자체는 변경되지 않았습니다. 목록을 변경하려면 Linq 메서드를 다음과 같이 변경합니다.

li = li.OrderBy(i => i).ToList();

1
@onedaywhen 다른 사용자의 답변이 정확하지 않다고 생각되면 다른 사람의 답변이 옳다고 생각하는 것을 편집하지 말고 댓글을 달고, 투표하고, 옳다고 생각하는 답변을 제공해야합니다.
Servy

24
내림차순의 경우 여기에 사용 li.Sort((a, b) => b.CompareTo(a));-1*접근 방식 보다 사용하는 것이 훨씬 더 명확하다고 생각합니다 . 그에 따라 답변을 편집했지만 @Servy가 되돌 렸습니다.
onedaywhen

9
@onedaywhen 저자가 의도 한 내용을 작성하는 데 실수를했을 때 의도 한대로 변경하는 것은 괜찮습니다. 다른 사람이 해결책이되어야한다고 생각하는 코드 형태를 변경하는 것은 적절한 편집이 아니라고 생각하는 다른 접근 방식을 사용하는 것입니다.
Servy

5
@onedaywhen 물론입니다. 편집 설명이있는 곳이면 어디에서나 볼 수 있습니다. 도움말 센터에서 "언제 게시물을 편집해야합니까? [...] 게시물의 의미를 명확히하기 위해 (그 의미를 변경하지 않고)"
Servy

4
아니면 그냥 -a.CompareTo(b).
Shimmy Weitzhandler

72

Linq없이 :

오름차순 :

li.Sort();

내림차순 :

li.Sort();
li.Reverse();

Sort()void 메서드이므로 Reverse()이러한 방식으로 를 연결할 수 없습니다 . 2 개의 별도 작업이 필요합니다. 그러나 LINQ를 사용하면 연결할 수 OrderBy있지만 그 시점에서 OrderByDescending대신 사용해야 합니다.
Ahmad Mageed 2010-06-17


3

위의 모든 답변을 확인하고 추가 정보를 하나 더 추가하고 싶었습니다. 나는 목록을 DESC 순서로 정렬하고 싶었고 더 큰 입력에 대해 더 빠른 솔루션을 찾고 있었고 이전 에이 방법을 사용했습니다.

li.Sort();
li.Reverse();

하지만 내 테스트 케이스는 시간 제한을 초과하여 실패했기 때문에 아래 솔루션이 저에게 효과적이었습니다.

li.Sort((a, b) => b.CompareTo(a));

따라서 궁극적으로 결론은 내림차순으로 목록을 정렬하는 두 번째 방법이 이전보다 약간 빠르다는 것입니다.


-3

내림차순으로 int 값으로 목록을 정렬하는 매우 간단한 방법 :

li.Sort((a,b)=> b-a);

이것이 도움이되기를 바랍니다!


4
이것은 int.CompareTo(int)문이 이유 가 아닙니다 . referencesource.microsoft.com에서 " 빼기가 매우 큰 음수 등에 대해 양수로 래핑되므로 비교를 사용해야합니다 ." 라는 소스를 참조 하십시오 . 당신이있는 경우 b = int.MinValuea = 1(말)이 실패합니다. 때로는 메서드 호출이 그만한 가치가 있습니다.
Wai Ha Lee

질문은 일반 목록 정렬에 대해 말합니다. "-"연산은 많은 유형에 대해서도 컴파일되지 않습니다. 전 주석에 언급 한 바와 같이 그리고 유형의 컴파일 된 세트는 숫자 오버플로 오류가있을 수
바딤 Levkovsky
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.