加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 00:13:04 所属栏目:百科 来源:网络整理
导读:我需要根据指定的下限删除字典中的所有条目. 我目前的解决方案是: Liststring keys = new Liststring(); foreach (KeyValuePairstring,int kvp in dic) { if (kvp.Value lowerBound) keys.Add(kvp.Key); } foreach (string key in keys) dic.Remove(key);
我需要根据指定的下限删除字典中的所有条目.

我目前的解决方案是:

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,但我得到:

The name ‘kvp’ does not exist in the current context

The type arguments for method ‘System.Linq.Enumerable.Where(System.Collections.Generic.IEnumerable,System.Func)’ cannot be inferred from the usage. Try specifying the type arguments explicitly.

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

解决方法

不要显式删除它们,只使用高于该下限的值重新分配字典:

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

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

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

kvp => kvp.Value > lowerBound

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

kvp.Value > lowerBound

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

有关lambda表达式的更多信息,请阅读this.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读