bro*_*ing 3 c# linq dictionary .net-3.5
我需要根据指定的下限删除字典中的所有条目.
我目前的解决方案是:
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);
Run Code Online (Sandbox Code Playgroud)
然而,这相当昂贵,特别是因为字典的大小相当大.
我见过LINQ解决方案,如:
foreach(var kvp in dic.Where(kvp.Value <= lowerBound).ToDictionary())
{
dic.Remove(kvp.Key);
}
Run Code Online (Sandbox Code Playgroud)
我认为它更好,因为它只是一个foreach,但我得到:
当前上下文中不存在名称"kvp"
无法从用法中推断出方法'System.Linq.Enumerable.Where(System.Collections.Generic.IEnumerable,System.Func)'的类型参数.尝试显式指定类型参数.
我承认我对LINQ一无所知,所以任何想法如何使第二个解决方案工作,或更好的?
Dav*_*ton 13
不要显式删除它们,只使用高于该下限的值重新分配字典:
dic = dic.Where(kvp => kvp.Value > lowerBound).ToDictionary();
Run Code Online (Sandbox Code Playgroud)
这样你就可以完全消除你在那里的foreach循环.
此外,您收到该错误的原因是您没有使用正确的lambda语法.事实上,你根本就没有使用lambda.表达方式:
kvp => kvp.Value > lowerBound
Run Code Online (Sandbox Code Playgroud)
是一个带有一个参数的方法的简写,称为"kvp",并返回表达式的求值:
kvp.Value > lowerBound
Run Code Online (Sandbox Code Playgroud)
它=>被称为"lambda运算符",它将参数值与返回的输出值分开.每个接受Func的LINQ方法都要求某种类型的委托,通常表示为lambda表达式以简洁起见.当你给它lambda表达式时,编译器将停止抱怨.
有关lambda表达式的更多信息,请阅读此内容.
| 归档时间: |
|
| 查看次数: |
8410 次 |
| 最近记录: |