2017-11-09 4 views
2

Wie kann ich ein Wörterbuch Elemente in zwei separate Wörterbuch zu teilen. Zum Beispiel ..Wie man ein Wörterbuch in zwei teilt

Dictionary<string, int> dict = new Dictionary<string, int>(); 

dictionary.Add("cat1", 1); 
dictionary.Add("dog2", 2); 
dictionary.Add("cat3", 3); 
dictionary.Add("dog4", 4); 
dictionary.Add("cat5", 5); 
dictionary.Add("dog6", 6); 
dictionary.Add("cat7", 7); 
dictionary.Add("dog8", 8); 
dictionary.Add("cat9", 9); 
dictionary.Add("dog10", 10); 
... 
dictionary.Add("dog100", 100); 

Dieses "dict" enthält 100 Elemente. Aber ich muss zuerst fünfzig und letzten fünfzig Elemente in zwei verschiedenen Wörterbuch trennen, wie ..

Dictionary<string, int> dict1 = new Dictionary<string, int>(); 
Dictionary<string, int> dict2 = new Dictionary<string, int>(); 

Bitte leite mich ..

Dank

+0

In einem 'Dictionary ' gibt es keine "ersten fünfzig" und "letzten fünfzig". Die Reihenfolge der Elemente im Wörterbuch ist nicht definiert und kann sich mit jeder Änderung des Wörterbuchs ändern. Was auch immer Sie wirklich wollen, sicherlich wäre es nicht schwer für Sie gewesen, _etwas _ zu versuchen. Dann könntest du wenigstens ein [mcve] bereitstellen, das zeigt, was du versucht hast, was uns helfen würde zu verstehen (möglicherweise), was dein _precise_ Ziel ist und welche Art von Antwort am besten ist. Sie haben unten eine Option, und vielleicht wird das funktionieren, aber es gibt viele Möglichkeiten, die Frage zu interpretieren. –

Antwort

2

Sie können dies tun:

Dictionary<string, int> dict1 = dict.Take(50).ToDictionary(c=>c.Key, c=>c.Value); 

Dictionary<string, int> dict2 = dict.Skip(50).ToDictionary(c=>c.Key, c=>c.Value); 

Mit Bestellung (Angenommen, Sie möchten den value Teil bestellen, der in Ihrem Beispiel ein integer ist:

Dictionary<string, int> dict1 = dict.OrderBy(c=>c.Value).Take(50).ToDictionary(c=>c.Key, c=>c.Value); 

Dictionary<string, int> dict2 = dict.OrderBy(c=>c.Value).Skip(50).ToDictionary(c=>c.Key, c=>c.Value); 
+0

Sie benötigen ein OrderedDictionary, um die Reihenfolge zu erhalten, die ich OP annehmen möchte. – Jokab

+2

Ich würde einfach sagen: 'var dict1 = dict.Take (50). ToDictionary ....;' anstatt zuerst zu initialisieren. –

+0

Danke für alle Eingaben, ich aktualisierte meine Antwort :) –

0

Teilen wir ein Wörterbuch in N ein (generalisiertes Problem; der letzte Brocken kann größer als andere sein) mit Hilfe von modularen Arithmetik:

Dictionary<string, int> dictionary = ... 

    int N = 2; 
    int mod = dictionary.Count/N; 

    Dictionary<string, int>[] result = dictionary 
    .Select((pair, index) => new { 
     index = index, 
     pair = pair, 
     })  
    .GroupBy(item => item.index/mod > N - 1 ? N - 1 : item.index/mod) 
    .Select(chunk => chunk.ToDictionary(item => item.pair.Key, item => item.pair.Value)) 
    .ToArray(); 

    Dictionary<string, int> dict1 = result[0]; 
    Dictionary<string, int> dict2 = result[1]; 
0

Wenn Sie es vorziehen, nicht Linq, Spaß haben mit diesem:

var firstHalf = new Dictionary<string, int>(); 
int i = 0, count = dictionary.Count; 
foreach (var item in dictionary.Keys.ToList()) 
{ 
    firstHalf.Add(item, dictionary[item]); 
    dictionary.Remove(item); 
    if (++i == count/2) break; 
} 

Beachten Sie, dass das ursprüngliche Wörterbuch, dictionary , wird jetzt nur die zweite Hälfte von dem enthalten, was vorher drin war.

Verwandte Themen