키와 관련하여 사전 정렬
C #에 사전이 있습니다.
Dictionary<Person, int>
키 (Person 클래스의 필드)와 관련하여 해당 사전 을 제자리 에 정렬하고 싶습니다 . 어떻게하니? 인터넷에서 사용 가능한 모든 도움말은 사전 정렬의 특별한 예가없는 목록의 도움말입니다. 어떤 도움이라도 대단히 감사하겠습니다!
당신은 정렬 할 수 없습니다 Dictionary<TKey, TValue>-그것은 본질적으로 순서가 없습니다. (또는 항목이 검색되는 순서는 구현에 따라 다릅니다. 순서는 설계된 기능의 일부가 아니므로 버전간에 동일한 방식으로 작동하는 것에 의존해서는 안됩니다.)
당신은 할 수 사용 SortedList<TKey, TValue>하거나 SortedDictionary<TKey, TValue>(당신이를 통과하면, 구성 방법으로이 두 종류의 키에 의해, IEqualityComparer<T>생성자에) - 사람들은 당신에게 유용 할 수 있는가?
이름에있는 "list"라는 단어에 거의주의를 기울이지 SortedList마십시오. 키를 값에 매핑한다는 점에서 여전히 사전입니다. 그것은 것 구현 효과적으로 내부 목록을 사용하여 - 그래서 대신 해시 코드에 의해 찾고, 그것은 이진 검색을 수행합니다. SortedDictionary유사하게 이진 검색을 기반으로하지만 목록 대신 트리를 사용합니다.
SortedDictionary를 사용해보십시오
정답은 이미 명시되어 있습니다 (SortedDictionary 사용).
그러나 우연히 컬렉션을 사전으로 유지해야하는 경우, 예를 들어 목록에서 키를 정렬 한 다음이 목록을 사용하여 사전에 액세스하는 등 순서가 지정된 방식으로 사전 키에 액세스 할 수 있습니다. 예 ...
Dictionary<string, int> dupcheck = new Dictionary<string, int>();
... "dupcheck"를 채우는 일부 코드, 그리고 ...
if (dupcheck.Count > 0) {
Console.WriteLine("\ndupcheck (count: {0})\n----", dupcheck.Count);
var keys_sorted = dupcheck.Keys.ToList();
keys_sorted.Sort();
foreach (var k in keys_sorted) {
Console.WriteLine("{0} = {1}", k, dupcheck[k]);
}
}
이것을 잊지 마세요 using System.Linq;.
설계 상 사전은 정렬 할 수 없습니다. 사전에이 기능이 필요한 경우 대신 SortedDictionary를 살펴보십시오.
를 살펴보면 SortedDictionary생성자 오버로드도 있으므로 비교를 위해 고유 한 IComparable을 전달할 수 있습니다.
Dictionary는 해시 테이블로 구현되는 반면 SortedDictionary는 Red-Black Tree로 구현됩니다.
알고리즘의 순서를 활용하지 않고 출력 전에 데이터를 정렬해야하는 경우 SortedDictionary를 사용하면 성능에 부정적인 영향을 미칩니다 .
다음과 같이 사전을 "정렬"할 수 있습니다.
Dictionary<string, int> dictionary = new Dictionary<string, int>();
// algorithm
return new SortedDictionary<string, int>(dictionary);
이 답변의 높은 검색 순위로 인해 LINQ OrderBy 솔루션이 보여줄 가치가 있다고 생각했습니다 .
class Person
{
public Person(string firstname, string lastname)
{
FirstName = firstname;
LastName = lastname;
}
public string FirstName { get; set; }
public string LastName { get; set; }
}
static void Main(string[] args)
{
Dictionary<Person, int> People = new Dictionary<Person, int>();
People.Add(new Person("John", "Doe"), 1);
People.Add(new Person("Mary", "Poe"), 2);
People.Add(new Person("Richard", "Roe"), 3);
People.Add(new Person("Anne", "Roe"), 4);
People.Add(new Person("Mark", "Moe"), 5);
People.Add(new Person("Larry", "Loe"), 6);
People.Add(new Person("Jane", "Doe"), 7);
foreach (KeyValuePair<Person, int> person in People.OrderBy(i => i.Key.LastName))
{
Debug.WriteLine(person.Key.LastName + ", " + person.Key.FirstName + " - Id: " + person.Value.ToString());
}
}
산출:
Doe, John - Id: 1
Doe, Jane - Id: 7
Loe, Larry - Id: 6
Moe, Mark - Id: 5
Poe, Mary - Id: 2
Roe, Richard - Id: 3
Roe, Anne - Id: 4
이 예에서는 이름에 ThenBy 를 사용하는 것이 좋습니다 .
foreach (KeyValuePair<Person, int> person in People.OrderBy(i => i.Key.LastName).ThenBy(i => i.Key.FirstName))
그러면 출력은 다음과 같습니다.
Doe, Jane - Id: 7
Doe, John - Id: 1
Loe, Larry - Id: 6
Moe, Mark - Id: 5
Poe, Mary - Id: 2
Roe, Anne - Id: 4
Roe, Richard - Id: 3
LINQ에는 필요한 사용자를 위한 OrderByDescending 및 ThenByDescending 도 있습니다 .
참고 URL : https://stackoverflow.com/questions/2705607/sorting-a-dictionary-in-place-with-respect-to-keys
'program story' 카테고리의 다른 글
| ADB 서버 버전 (36)이이 클라이언트 (39)와 일치하지 않습니다. {Genymotion을 사용하지 않음} (0) | 2020.11.03 |
|---|---|
| JavaScript의 루프 타이머 (0) | 2020.11.03 |
| 더 이상 Bash 스크립팅을 사용할 수 있습니까? (0) | 2020.11.03 |
| Android에서 DigestUtils를 사용하여 메서드를 찾을 수 없음 (0) | 2020.11.03 |
| Asp.net MVC4 : 컨트롤러와 작업 모두에 대한 권한 부여 (0) | 2020.11.03 |