2015-05-06 2 views
0

Я хочу построить словарь изПостроить новый словарь, основанный на критериях стоимости

Dictionary<int, List<string>> dict = new Dictionary<int, List<string>>(); 
dict.Add(1, new List<string>() { "1", "2", "3" }); 
dict.Add(2, new List<string>() { "4", "5", "6" }); 
dict.Add(3, new List<string>() { "7", "8", "9" }); 

таким образом, что критерий является подсчетом значений из списка удовлетворяет заданный целое число я.

Ex: для i=4 Я хочу, чтобы результат

Dictionary<int, List<string>> res= new Dictionary<int, List<string>>(); 
dict.Add(1, new List<string>() { "1", "2", "3" }); 
dict.Add(2, new List<string>() { "4"}); 

и i=7 Я хочу, чтобы результат

Dictionary<int, List<string>> res= new Dictionary<int, List<string>>(); 
dict.Add(1, new List<string>() { "1", "2", "3" }); 
dict.Add(2, new List<string>() { "4", "5", "6" }); 
dict.Add(3, new List<string>() { "7"}); 

Я попытался с помощью Take а для я = 5, но это не достойно.

var res = dict.Select(x => x).TakeWhile(y => dict.Values.ToList().Count < 6); 

Любые предложения, пожалуйста?

+0

Вы говорите, что хотите построить словарь, но потом вы говорите, что хотите запросить его ... что это? – dcastro

+1

На каком языке вы ищете ответ? C# или VB.Net, так как вы связали оба тега? –

+0

либо C#, либо vb.net – viento

ответ

0

Вы можете перебирать исходный словарь и вычислить количество значений на каждую итерацию, а затем заполнить словарь результата, как:

int i = 4; 
Dictionary<int, List<string>> res = new Dictionary<int, List<string>>(); 
foreach (var item in dict) 
{ 
    int takeItems = i - res.Values.SelectMany(r => r).Count(); 
    if (takeItems > 0) 
    { 
     res.Add(item.Key, item.Value.Take(takeItems).ToList()); 
    } 
    else 
    { 
     break; 
    } 
} 

DEMO

+0

Хотя это решает проблему, о которой я упоминал, но я смотрю на способы ее достижения через linq. – viento

Смежные вопросы