c# - unity - wpf dictionary orderby




값을 기준으로 사전을 어떻게 정렬합니까? (12)

LINQ 사용 :

Dictionary<string, int> myDict = new Dictionary<string, int>();
myDict.Add("one", 1);
myDict.Add("four", 4);
myDict.Add("two", 2);
myDict.Add("three", 3);

var sortedDict = from entry in myDict orderby entry.Value ascending select entry;

또한 상위 10, 20 10 % 등을 선택할 수 있다는 점에서 유연성이 뛰어납니다. 또는 type-ahead 단어 빈도 인덱스를 사용하는 경우 StartsWith 절도 포함 할 수 있습니다.

나는 종종 키와 값으로 구성된 사전을 값으로 정렬해야합니다. 예를 들어, 나는 단어로 된 해시와 각 주파수를 가지고 있으며, 주파수별로 주문하고 싶습니다.

단일 값 (예 : 빈도)에 좋은 SortedList 있는데, 단어에 다시 매핑하려고합니다.

값이 아닌 키를 기준으로 SortedDictionary 순서. 일부는 커스텀 클래스에 의존하지만 더 깨끗한 방법이 있습니까?


VB.NET을 사용하여 ListView 컨트롤에 바인딩 할 SortedDictionary 목록 정렬 :

Dim MyDictionary As SortedDictionary(Of String, MyDictionaryEntry)

MyDictionaryListView.ItemsSource = MyDictionary.Values.OrderByDescending(Function(entry) entry.MyValue)

Public Class MyDictionaryEntry ' Need Property for GridViewColumn DisplayMemberBinding
    Public Property MyString As String
    Public Property MyValue As Integer
End Class

XAML :

<ListView Name="MyDictionaryListView">
    <ListView.View>
        <GridView>
            <GridViewColumn DisplayMemberBinding="{Binding Path=MyString}" Header="MyStringColumnName"></GridViewColumn>
            <GridViewColumn DisplayMemberBinding="{Binding Path=MyValue}" Header="MyValueColumnName"></GridViewColumn>
         </GridView>
    </ListView.View>
</ListView>

값을 기준으로 사전을 정렬하고 다시 저장하면됩니다 (따라서 사전에 값이 순서대로 나오도록).

dict = dict.OrderBy(x => x.Value).ToDictionary(x => x.Key, x => x.Value);

물론 정확하지는 않지만 작동합니다.


높은 수준에서 사전 전체를 살펴보고 각 값을 보는 것 외에 다른 선택은 없습니다.

아마도 이것이 도움이 될 것입니다 : http://bytes.com/forum/thread563638.html John Timney의 복사 / Pasting :

Dictionary<string, string> s = new Dictionary<string, string>();
s.Add("1", "a Item");
s.Add("2", "c Item");
s.Add("3", "b Item");

List<KeyValuePair<string, string>> myList = new List<KeyValuePair<string, string>>(s);
myList.Sort(
    delegate(KeyValuePair<string, string> firstPair,
    KeyValuePair<string, string> nextPair)
    {
        return firstPair.Value.CompareTo(nextPair.Value);
    }
);

당신이 원하는 모든 것이 "일시적인"목록을 값으로 정렬하는 것이라면 다른 대답도 좋습니다. 그러나 Value 로 정렬 된 다른 사전과 자동으로 동기화 되는 Key 정렬 된 사전을 가지려면 Bijection<K1, K2> 클래스를 사용할 수 있습니다.

Bijection<K1, K2> 사용하면 두 개의 기존 사전으로 컬렉션을 초기화 할 수 있으므로이 중 하나를 정렬하지 않고 다른 하나를 정렬하려면 다음과 같은 코드로 Bijection을 만들 수 있습니다.

var dict = new Bijection<Key, Value>(new Dictionary<Key,Value>(), 
                               new SortedDictionary<Value,Key>());

dict 일반 사전 ( IDictionary<K, V> 구현)과 같이 사용하고 dict.Inverse 를 호출하여 "inverse"사전을 가져 dict.Inverse Value 로 정렬 할 수 있습니다.

Bijection<K1, K2>Loyc.Collections.dll 일부이지만 원하는 경우 소스 코드 를 자신의 프로젝트에 간단히 복사 할 수 있습니다.

참고 : 동일한 값을 가진 여러 키가있는 경우 Bijection 사용할 수 없지만 일반 Dictionary<Key,Value> BMultiMap<Value,Key> 간에 수동으로 동기화 할 수 있습니다.


둘러보고 C # 3.0 기능을 사용하면 다음과 같이 할 수 있습니다.

foreach (KeyValuePair<string,int> item in keywordCounts.OrderBy(key=> key.Value))
{ 
    // do something with item.Key and item.Value
}

이것은 내가 본 가장 깨끗한 방법이며 해시를 처리하는 루비 방법과 비슷합니다.


사전에서 항목을 정렬하지 않습니다. .NET의 Dictionary 클래스는 해시 테이블로 구현됩니다.이 데이터 구조는 정의별로 정렬 할 수 없습니다.

컬렉션별로 키를 반복해야 할 경우-Binary Search Tree로 구현 된 SortedDictionary를 사용해야합니다.

그러나 소스 구조는 다른 필드로 정렬되므로 소스 구조는 관련이 없습니다. 여전히 빈도별로 정렬하고 관련 필드 (빈도)별로 정렬 된 새 컬렉션에 배치해야합니다. 따라서이 모음에서 빈도는 키이고 단어는 값입니다. 많은 단어가 같은 빈도를 가질 수 있고 (키로 사용하려고 할 때) Dictionary 또는 SortedDictionary (고유 키가 필요함)를 사용할 수 없습니다. 그러면 SortedList가 남습니다.

주 / 첫 사전에서 원본 항목에 대한 링크를 유지해야한다고 주장하는 이유를 이해하지 못합니다.

콜렉션의 오브젝트가 더 복잡한 구조 (더 많은 필드)를 가지고 있고 여러 다른 필드를 키로 사용하여 효율적으로 액세스 / 정렬 할 수 있어야하는 경우, 기본 스토리지로 구성된 사용자 정의 데이터 구조가 필요할 것입니다. O (1) 삽입 및 제거 (LinkedList) 및 여러 인덱싱 구조 (Dictionaries / SortedDictionaries / SortedLists)를 지원합니다. 이 인덱스는 복잡한 클래스의 필드 중 하나를 키로 사용하고 LinkedList의 LinkedListNode에 대한 포인터 / 참조를 값으로 사용합니다.

인덱스를 기본 컬렉션 (LinkedList)과 동기화하려면 삽입 및 제거를 조정해야하며 제거는 꽤 비쌀 것입니다. 이것은 데이터베이스 인덱스의 작동 방식과 유사합니다. 조회에는 환상적이지만 많은 삽입과 삭제를 수행해야 할 때 부담이됩니다.

위의 모든 사항은 조회 무거운 처리를 수행하려는 경우에만 정당화됩니다. 한 번만 주파수별로 정렬하여 출력 해야하는 경우 (익명) 튜플 목록을 생성 할 수 있습니다.

var dict = new SortedDictionary<string, int>();
// ToDo: populate dict

var output = dict.OrderBy(e => e.Value).Select(e => new {frequency = e.Value, word = e.Key}).ToList();

foreach (var entry in output)
{
    Console.WriteLine("frequency:{0}, word: {1}",entry.frequency,entry.word);
}

사전이 있다고 가정하면 하나의 라이너를 사용하여 값을 직접 정렬 할 수 있습니다.

var x = (from c in dict orderby c.Value.Order ascending select c).ToDictionary(c => c.Key, c=>c.Value);

아래 코드를 사용하여 사전을 값별로 정렬하고 결과를 사전으로 가져올 수 있습니다.

Dictionary <<string, string>> ShareUserNewCopy = 
       ShareUserCopy.OrderBy(x => x.Value).ToDictionary(pair => pair.Key,
                                                        pair => pair.Value);                                          

어쨌든 사전을 정렬 할 수 없습니다. 그들은 실제로 주문되지 않았습니다. 사전에 대한 보장은 키 및 값 콜렉션이 반복 가능하며 인덱스 또는 키로 값을 검색 할 수 있지만 특정 순서를 보장하지는 않습니다. 따라서 이름 값 쌍을 목록으로 가져와야합니다.


정렬 된 사전을 얻는 가장 쉬운 방법은 내장 된 SortedDictionary 클래스를 사용하는 것입니다.

//Sorts sections according to the key value stored on "sections" unsorted dictionary, which is passed as a constructor argument
System.Collections.Generic.SortedDictionary<int, string> sortedSections = null;
if (sections != null)
{
    sortedSections = new SortedDictionary<int, string>(sections);
}

sortedSections 에는 sections 의 정렬 된 버전이 포함 sections


var ordered = dict.OrderBy(x => x.Value);






dictionary