2013-12-09 3 views
4

У меня есть SortedDictionaryПоиск ближайшего значения в SortedDictionary

SortedDictionary<int, CPUOptimizationObject> myDict; 

Теперь я хочу, чтобы найти первое значение выше X. я могу сделать что-то вроде этого

foreach (var iKey in MyDict.Keys) 
{ 
    if (iKey >= thresholdKey) 
    { 
     foundKey = iKey; 
     break; 
    } 
} 

, но это не хорошая производительность.
Любое лучшее предложение?
(есть метод, который в чем-то коллекции, как двоичный поиск SortedDictionary?)

+0

Использование двойного ключа не является хорошей идеей. Что вы там храните и почему используете SortedDictionary, если ищете ближайший матч? Какова проблема, которую вы пытаетесь решить? –

+0

Вы можете вызвать ToList(), а затем выполнить BinarySearch или LINQ. Но не уверен, что так быстрее. Возможно, вы можете улучшить свою технику для лучшего ключа или другого типа списка, как сказал Панагиотис. – Koryu

+0

Вы правильно относитесь к двойному. фиксированный до int. – Jeb

ответ

-2

Я не знаю, если это имеет лучшую производительность, чем Еогеасп, но это должно работать:

var foo = myDict.FirstOrDefault(i => i.Key > thresholdKey); 
+2

Спасибо. Я предполагаю, что это точно так же хорошо, как и foreach. – Jeb

+1

Это короче, но это будет делать почти то же самое. – Servy

0

Вы можете попробовать, если это будет быстрее. Но я думаю, что это будет быстрее, только если вы выполняете поиск несколько раз.

var keys = new List<int>(myDict.Keys); 
int index = keys.BinarySearch(thresholdKey); 
+1

Это, безусловно, будет медленнее, без вопросов, если вы не выполняете несколько запросов. – Servy

3

Хотя, в теории, найти наименьший элемент, который больше, чем заданное значение является операцией, которая может быть выполнена эффективно на бинарное дерево поиска (который является то, что SortedDictionary реализуется как) SortedDictionary не подвергать средства для выполнения такого поиска в этом типе данных.

Для эффективного выполнения такого поиска вам потребуется использовать различную реализацию двоичного дерева поиска, но при этом использовать структуру данных того же типа. Нет подходящих типов .NET; вам нужно будет использовать стороннюю реализацию (из которой их довольно много).

0

создать список временную п используя .toList() на вашем SortedDictionary Теперь, так что приводит список п вы могли бы сделать

n.Find(item =>item >20) 

получить первый ключ в ответ, который соответствует,

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