[c#] 목록을 알파벳순으로 정렬

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

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에 익숙하지 않습니다. 방금 사용할 수 있다는 제안을 들었습니다.



답변

다음 을 호출 하여 목록 을 제자리에서 정렬 할 수 있습니다 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를 사용한 셔플 링의 다른 구현이 있습니다-검색하면 매우 빠르게 찾을 수 있습니다.


답변

두 가지 방법이 있습니다.

LINQ없이 : yourList.Sort();

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

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


답변

또 다른 방법

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


답변

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

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


답변


답변