2010-03-02 2 views
3

поэтому мне нужно удалить все записи в словаре в соответствии с указанной нижней границей.Eficient способ удалить все записи в словаре ниже заданного значения

Мое текущее решение заключается в следующем:

List<string> keys = new List<string>(); 

    foreach (KeyValuePair<string, int> kvp in dic) 
    { 
     if (kvp.Value < lowerBound) 
      keys.Add(kvp.Key); 
    } 

    foreach (string key in keys) 
     dic.Remove(key); 

Однако это довольно дорого, тем более, что размер словаря является довольно большим.

Я видел решение LINQ, как:

foreach(var kvp in dic.Where(kvp.Value <= lowerBound).ToDictionary()) 
{ 
    dic.Remove(kvp.Key); 
} 

, который я предполагаю, что будет лучше, так как это только один Еогеасп, но я получаю:

Название «КВП» не существует в текущем контексте

Аргументы типа для метода 'System.Linq.Enumerable.Where (System.Collections.Generic.IEnumerable, System.Func)' не могут быть выведены из использования. Попробуйте явно указать аргументы типа.

Я признаю, что я ничего не знаю о LINQ, поэтому любые идеи о том, как сделать это 2-е решение, или лучше?

Thnx заблаговременно

+0

Если вы сделаете это удаление LowerBound часто, то, возможно, словарь не правильная структура для вас. – 2010-03-02 16:13:19

+0

К счастью, мне просто нужно сделать это один раз. – brokencoding

ответ

13

Не удаляйте их явно, переназначить словарь, используя только те значения, которые выше, чем нижняя граница вместо:

dic = dic.Where(kvp => kvp.Value > lowerBound).ToDictionary(); 

Таким образом, вы можете полностью устранить этот цикл Еогеасп вы получили в там.

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

kvp => kvp.Value > lowerBound 

представляет собой сокращенную метод, который принимает один параметр, называемый «КВП», и возвращает вычисление выражения:

kvp.Value > lowerBound 

=> называется «лямбда-оператор», и он отделяет прием параметров от возвращаемого вывода. Каждый метод LINQ, который принимает Func, запрашивает делегат какого-то рода, обычно выражаемый как краткое выражение лямбда. Когда вы дадите ему выражение лямбда, компилятор перестанет жаловаться.

Прочитать this для получения дополнительной информации о лямбда-выражениях.

+0

Только ответ пока что рассмотрел проблему, а не синтаксическую ошибку. –

+5

Thnx после добавления аргументов ToDictionary (kvp => kvp.key, kvp => kvp.value) работает – brokencoding

+0

Я удивлен, что это эффективно.Думаю, Линк волшебный! – 2010-03-02 20:15:33

0

Попробуйте это.

foreach(var kvp in dic.Where(x => x.Value <= lowerBound).ToDictionary()) 
{ 
    dic.Remove(kvp.Key); 
} 
0
dic.Where(kvp.Value <= lowerBound) 

заменить

dic.Where(kvp1 => kvp1.Value <= lowerBound)