2017-11-09 10 views
2

1つの辞書項目を2つの別々の辞書に分割する方法を教えてください。たとえば、..辞書を2つに分割する方法

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); 

この「dict」には100項目が含まれます。しかし、私は...

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

のように、二つの異なる辞書に50最初と最後の50の項目を分離する必要があるあなたがこれを行うことができます。..

おかげ

+0

'Dictionary 'には、「first fifty」や「last fifty」といったものはありません。辞書内の項目の順序は未定義であり、辞書の変更によって変更される可能性があります。あなたが実際に何を望んでいても、確かに何かを試してみるのは難しくありませんでした。それであなたは、あなたが試したことを示す[mcve]を提供することができます。これはあなたの_precise_目標が何であるか(おそらく)、そしてどんな答えが一番良いかを理解するのに役立ちます。下に1つのオプションがありますが、それはうまくいくかもしれませんが、質問を解釈する方法はたくさんあります。 –

答えて

2

を私を導いてください:

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); 

ご注文の場合value部品(ご注文の場合integer)をご希望の場合:

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

注文を保存するには、OrderedDictionaryが必要です。これは、OPが望むと仮定します。 – Jokab

+2

私はちょうど言っています: 'var dict1 = dict.Take(50).ToDictionary ....;'最初の初期化の代わりに。 –

+0

すべての入力をありがとう、私は私の答えを更新しました:) –

0

辞書をNものに分割しましょう(一般的な問題。これで楽しみを持って、

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

あなたがLinqを好まない場合:最後のチャンクは合同算術の助けを借りて)、他のものより大きくなることができ

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; 
} 

なお、オリジナルの辞書、dictionary以前はそれに含まれていたものの後半のみが含まれるようになりました。

関連する問題