我有Dictionary
如下所示。假设Dictionary
中有400个元素我希望将此Dictionary
拆分成4个大小相等的字典。我该怎么做呢?有了列表,我可以使用范围方法,但不知道该怎么做?
我并不关心Dictionary
是如何被分割的,只是为了它们的大小相等。
Dictionary<string, CompanyDetails> coDic;
答案 0 :(得分:10)
您可以使用简单模数将字典分成几部分:
int numberOfGroups = 4;
int counter = 0;
var result = dict.GroupBy(x => counter++ % numberOfGroups);
模数(%
)使GroupBy
限制在0..3
范围内的数字(实际为0..numberOfGroups - 1
)。这将为您进行分组。
虽然这个问题是它没有保留订单。这个确实:
decimal numberOfGroups = 4;
int counter = 0;
int groupSize = Convert.ToInt32(Math.Ceiling(dict.Count / numberOfGroups));
var result = dict.GroupBy(x => counter++ / groupSize);
答案 1 :(得分:3)
我会使用以下查询:
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();
这里的优点是避免关闭计数器,因为.Select((kvp, n) => ...)
语句内置了一个计数器。
答案 2 :(得分:0)
我在此代码中合并了帖子。结果是在IEnumerable<Dictionary<string, string>>
中使用foreach
。
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
}