删除字典中低于指定值的所有条目的有效方法

时间:2010-03-02 15:59:43

标签: c# linq .net-3.5 dictionary

我需要根据指定的下限删除字典中的所有条目。

我目前的解决方案是:

    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);
}

我认为它更好,因为它只是一个foreach,但我得到了:

  

当前上下文中不存在名称“kvp”

     

无法从用法推断出方法'System.Linq.Enumerable.Where(System.Collections.Generic.IEnumerable,System.Func)'的类型参数。尝试明确指定类型参数。

我承认我对LINQ一无所知,所以任何想法如何使第二个解决方案有效,或者更好?

3 个答案:

答案 0 :(得分:13)

请勿明确删除它们,只使用高于该下限的值重新分配字典:

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

这样你就可以完全消除你在那里的那个foreach循环。

此外,您收到该错误的原因是您没有使用正确的lambda语法。事实上,你根本就没有使用lambda。表达式:

kvp => kvp.Value > lowerBound

是一个带有一个参数的方法的简写,称为“kvp”,并返回表达式的评估:

kvp.Value > lowerBound

=>被称为“lambda运算符”,它将参数值与返回的输出值分开。每个接受Func的LINQ方法都要求某种类型的委托,通常表示为lambda表达式以简洁起见。当你给它lambda表达式时,编译器将停止抱怨。

阅读this以获取有关lambda表达式的更多信息。

答案 1 :(得分:0)

试试这个。

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

答案 2 :(得分:0)

dic.Where(kvp.Value <= lowerBound)

替换为

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