2015-05-12 27 views
6

Aşağıda gösterilen bir Dictionary var. Dictionary'da 400 öğe olduğunu varsayalım, bu Dictionary'u 4 eşit boyutlu sözlükte bölmek istiyorum. Bunu nasıl yaparım? Listede kullanabileceğim bir yöntem var, ancak burada ne yapacağınızdan emin değil misiniz?Birden çok eşit büyüklükteki sözlüklere bölünmüş sözlüğü

Dictionary'un, eşit boyutta olmaları için nasıl bölündüğü umrumda değil.

Dictionary<string, CompanyDetails> coDic; 
+6

401 öğe varsa ne olur? –

+0

sorun değil, 100 ve 1 ile 101 arasında 3 sözlük var. Bir sözlük nasıl bölüştürürümle ilgileniyorum – mHelpMe

+1

Bölünmüş sözlükle ne yapmak istersiniz? Performans veya yükleme baancing hakkında endişeleriniz varsa, sizin için iş yapacak özel koleksiyonlar var – PPC

cevap

9

Sen bölgelerinde gruba sözlüğü basit modülüne kullanabilirsiniz:

int numberOfGroups = 4; 
int counter = 0; 

var result = dict.GroupBy(x => counter++ % numberOfGroups); 

modülü (%) aralığında 0..3 (aslında 0..numberOfGroups - 1) bir sayıya kısıtlanmaya GroupBy yapar. Bu sizin için gruplandırmayı yapacak.

Bununla ilgili bir sorun, siparişin korunmamasıdır. Ama bu yapıyor:

Dictionary<string, CompanyDetails>[] result = 
    dict 
     .Select((kvp, n) => new { kvp, k = n % 4 }) 
     .GroupBy(x => x.k, x => x.kvp) 
     .Select(x => x.ToDictionary(y => y.Key, y => y.Value)) 
     .ToArray(); 

Buradaki avantaj .Select((kvp, n) => ...) ifadesi olarak bir reçetesiz kapanış kaçınma olan bir sayaç yerleşik vardır:

decimal numberOfGroups = 4; 
int counter = 0; 
int groupSize = Convert.ToInt32(Math.Ceiling(dict.Count/numberOfGroups)); 

var result = dict.GroupBy(x => counter++/groupSize); 
+2

Şunun gibi bir şeye sahip olabilir: '.Sonraki (g => g.ToDictionary (h => h.Key, h => h.Value))' result'. – weston

+0

Neden sözlüklerde siparişe önem verileceğini anlamıyorum? Bir sözlük numaralandırılırken olduğu gibi ["Öğelerin döndürülme sırası tanımsızdır."] (https://msdn.microsoft.com/en-us/library/xfhwa508.aspx) – weston

+0

@weston gerçekten de ikinci uygulama yararlıdır. 'bütünlüğü uğruna'. –

0

Bu koddaki yayınları birleştirdim. Sonuç, örneğin foreach’da kullanmak için IEnumerable<Dictionary<string, string>>’dur.

int counter = 0; 
int groupSize = 5; 
IEnumerable<Dictionary<string, string>> result = info 
    .GroupBy(x => counter++/groupSize) 
    .Select(g => g.ToDictionary(h => h.Key, h => h.Value)); 

foreach (Dictionary<string, string> rsl in result) { 
    // your code 
} 
İlgili konular