목록을 알파벳순으로 정렬


83

다음과 같은 수업이 있습니다.

class Detail
{
    public Detail()
    {
        _details = new List<string>();
    }
    public IList<string> Details { get { return _details; } }
    private readonly List<string> _details;
}

현재 다음을 사용하여 무작위로 클래스를 정렬합니다.

void ShuffleGenericList<T>(IList<T> list)
{
    //generate a Random instance
    var rnd = new Random();
    //get the count of items in the list
    var i = list.Count();
    //do we have a reference type or a value type
    T val = default(T);

    //we will loop through the list backwards
    while (i >= 1)
    {
        //decrement our counter
        i--;
        //grab the next random item from the list
        var nextIndex = rnd.Next(i, list.Count());
        val = list[nextIndex];
        //start swapping values
        list[nextIndex] = list[i];
        list[i] = val;
    }
}

제가하고 싶은 것은 세부 내용을 알파벳 순서로 정렬하는 것입니다.

예를 들어 내용이 다음과 같은 경우 :

[0] a
[1] d
[2] b

이 방법을 실행하고 다음과 같이 정렬 할 수 있기를 원합니다.

[0] a
[1] b
[2] d

이 작업을 수행하는 간단한 방법을 아는 사람이 있습니까? 목록에는 일반적으로 10 개 미만의 항목이 있습니다. LINQ로이 작업을 수행 할 수 있습니까? 죄송하지만 LINQ에 익숙하지 않습니다. 방금 사용할 수 있다는 제안을 들었습니다.

답변:


155

다음 을 호출 하여 목록 을 제자리에서 정렬 할 수 있습니다 List<T>.Sort.

list.Sort();

그것은 당신의 경우에 괜찮은 요소의 자연스러운 순서를 사용합니다.

편집 : 코드에서

_details.Sort();

애즈 Sort방법에서만 정의 List<T>하지 IList<T>. 액세스 할 수없는 외부에서 정렬해야하는 경우 List<T>( List<T>부분이 구현 세부 사항이므로 캐스트해서는 안 됨 ) 약간 더 많은 작업을 수행해야합니다.

나는하지 않습니다 알고 어떤의 IList<T>이상한 지금 내가 생각하는 올 약간입니다 .NET에 기반 제자리 정렬합니다. IList<T>필요한 모든 것을 제공하므로 확장 메서드로 작성할 있습니다. 그중 하나를 사용하려는 경우 주변에 많은 빠른 정렬 구현이 있습니다.

약간의 비 효율성에 신경 쓰지 않는다면 항상 다음을 사용할 수 있습니다.

public void Sort<T>(IList<T> list)
{
    List<T> tmp = new List<T>(list);
    tmp.Sort();
    for (int i = 0; i < tmp.Count; i++)
    {
        list[i] = tmp[i];
    }
}

즉, 제자리에 복사하고 정렬 한 다음 정렬 된 목록을 다시 복사합니다.


LINQ를 사용 하여 원래 값을 포함하지만 정렬 된 목록 을 만들 수 있습니다 .

var sortedList = list.OrderBy(x => x).ToList();

원하는 행동에 따라 다릅니다. 셔플 방법은 실제로 이상적이지 않습니다.

  • Random메소드 내에서 새로 작성하면 여기에 표시된 몇 가지 문제가 발생 합니다.
  • val루프 내부에서 선언 할 수 있습니다. 기본값을 사용 하지 않습니다.
  • 작업중인 것을 알Count 때 속성 을 사용하는 것이 더 관용적 입니다.IList<T>
  • 내 마음하려면 for루프는 함께 목록 뒤쪽을 통과하는 것보다 이해하는 단순 while루프

Stack Overflow에서 Fisher-Yates를 사용한 셔플 링의 다른 구현이 있습니다-검색하면 매우 빠르게 찾을 수 있습니다.


따라서 위에서 만든 목록을 정렬하려면 다음과 같이 말하면됩니다. sortedList.Sort?
Mariko

정렬을 시도했지만 작동하지 않습니다.-내 목록은 다음과 같습니다. IList <string> nD. nD.Sort () 시도했지만 '정렬'기호를 해결할 수 없습니다.
Mariko

@Mariko은 : 사용 _details.Sort()대신에 -로 _detailsA와 선언 List<string>이 아니라 IList<string>. Sort만에 선언 List<T>하지 IList<T>.
Jon Skeet 2011-08-06

25

두 가지 방법이 있습니다.

LINQ없이 : yourList.Sort();

LINQ 사용 : yourList.OrderBy(x => x).ToList()

https://www.dotnetperls.com/sort 에서 자세한 정보를 찾을 수 있습니다.


@Dminox-내 목록은 다음과 같습니다. IList <string> nD. nD.Sort () 시도했지만 '정렬'기호를 해결할 수 없습니다.
Mariko

1
@Mariko Sort()List<T> not 의 회원입니다 IList<T>. 전자로 전환하는 것을 고려할 수 있습니다 (다른 IList<T>구현 으로 작업 할 것으로 예상하지 않는 한 ).
dlev

24

또 다른 방법

_details.Sort((s1, s2) => s1.CompareTo(s2)); 

10
이것은 속성 중 하나를 기준으로 모든 객체정렬하는 데 적응하는 장점이 있습니다 .
MGOwen

11

OrderByLINQ 에서 사용할 수 있어야합니다 .

var sortedItems = myList.OrderBy(s => s);

2
참고 : 반환 IEnumerable<T>및 정렬에-장소가 아니다
abatishchev

1

@goril-이것을 사용하고 싶지만 오류가 발생합니다. 이것이 제가 다른 댓글에 추가 한 것입니다. 당신이 도울 수 있기를 바랍니다-내 목록은 다음과 같습니다 : IList <string> nD. nD.Sort () 시도했지만 '정렬'기호를 해결할 수 없습니다.
Mariko

1
@Mariko : Sort 메서드를 포함하지 않는 IList <T> 인터페이스를 사용합니다. List <T> 변수를 직접 정렬합니다. 즉 당신은 정렬 할 수 있습니다 _details귀하의 예제에서가 아니라Details
올렉 Dudnyk에게
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.