2015-05-09 2 views
1

У меня есть словарь first<string, double> с двойными значениями в диапазоне от 0 до 1, я хочу сделать еще один словарь, который принимает только 10 значений, но те, которые наиболее удалены от 0.5. Во-первых, я думал о создании словарей asc/desc, но что, если значения были такими же, как 10 x 0,9 в desc, и около 0,45. в порядке возрастания, то я бы хотел только получить более высокие значения, поскольку 0,45 составляет всего 0,05 от 0,5 и 0,9 от 0,4 от центра.C# Значение в словаре

Есть ли способ в словарь, чтобы сделать это, или мне нужно код в цикле, как:

абс (first.Value - 0,5), а затем добавить это значение с тем же ключом в новый словарь и использования. Возьмите (10)?

+0

Я думаю, вы могли бы использовать LINQ, чтобы пройти через словарь, разбирайтесь на расстояние, а затем взять 10, чтобы сделать это простейшее. Сам словарь не имеет ничего, чтобы помочь с этим. –

ответ

3
var second = first.OrderByDescending(kvp => Math.Abs(kvp.Value - 0.5)) 
        .Take(10) 
        .ToDictionary(kvp => kvp.Key, kvp => kvp.Value); 
+0

@xanatos yep, вы правы, спасибо :) –

1
Dictionary<string, double> firstDic = new Dictionary<string, double>(); 
// fill 

Dictionary<string, double> secondDic = (from e in firstDic 
             let distance = Math.Abs(e.Value - 0.5) 
             orderby distance descending 
             select e).Take(10).ToDictionary(e => e.Key, e => e.Value);