[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));
답변
OrderBy
LINQ 에서 사용할 수 있어야합니다 .
var sortedItems = myList.OrderBy(s => s);
답변
무엇이 문제 List<T>.Sort()
입니까?
https://docs.microsoft.com/en-us/dotnet/api/system.collections.generic.list-1.sort#overloads