C#将每个循环的格式设置为Lambda
我刚开始学习C#,学习了以下课程:C#将每个循环的格式设置为Lambda,c#,linq,lambda,C#,Linq,Lambda,我刚开始学习C#,学习了以下课程: using System; using System.Collections.Generic; class PrefixMapSum : Dictionary<String, int> { public bool insert(String key, int value) { return base.TryAdd(key, value); } public int sum(String prefix)
using System;
using System.Collections.Generic;
class PrefixMapSum : Dictionary<String, int> {
public bool insert(String key, int value) {
return base.TryAdd(key, value);
}
public int sum(String prefix) {
int sum = 0;
foreach (String key in base.Keys) {
if (key.StartsWith(prefix)) {
sum = sum + base[key];
}
}
return sum;
}
}
我试过:
new List<String>(base.Keys).ForEach(key => key.StartsWith(prefix) ? sum = sum + base[key] : sum = sum);
新列表(base.Keys).ForEach(key=>key.StartsWith(前缀)?sum=sum+base[key]:sum=sum);
但我遇到了这个错误:
我来自Java,我不太明白为什么它不工作。谁能解释一下我应该做什么不同的事情(以及为什么)?您可以使用Linq:
var sum = base.Keys.Where(key => key.StartsWith(prefix))
.Sum(key => base[key]);
仅当筛选后至少有一个元素时,此操作才有效
base.Keys
.Where(key=> key.StartsWith(prefix))
.Sum(base[key])
如果没有(该方法无法求和),则可以使用此DefaultIfEmpty
,因此求和为0
base.Keys
.Where(key=> key.StartsWith(prefix))
.Select(key=> base[key])
.DefaultIfEmpty(0)
.Sum()
出于性能原因,您可能希望避免使用索引器,而是自己迭代字典
var defaultZero = new KeyValuePair<string, int>(string.Empty, 0);
var sum = this
.Where(pair => pair.Key.StartsWith(prefix))
.DefaultIfEmpty(defaultZero)
.Sum(pair => pair.Value);
您可以使用
System.Linq
,使用方法筛选键,然后通过传递Func
选择器来获取筛选键的值
公共整数和(字符串前缀)
{
返回base.Keys.Where(key=>key.StartsWith(prefix)).Sum(key=>base[key]);
}
为了提高性能,尽可能避免使用索引器(即:调用base[key]
)。在这里,您可以直接使用KeyValuePair
枚举:
public int Sum(string prefix) => this.Where(kvp => kvp.Key.StartsWith(prefix)).Sum(kvp => kvp.Value);
您可以将其作为一个简单的Linq查询:
在Java中也会出现类似的错误。您试图将三元运算符当作
if
块来使用。赋值是表达式,因此此调用将返回一个值,但ForEach
需要执行某些操作的语句,而不是表达式在Java中有更好的方法来过滤和聚合值,例如使用流。语法本身与LINQ的base非常相似,其中不起作用。您应该处理此
。感谢您的解释,上面的示例告诉我CS0103(所选零件的键未知)
var elements =this
.Where(pair => pair.Key.StartsWith(prefix))
.Select(x=>x.Value);
if(!elements.Any()){
// your logic here
}else{
sum= elements.Sum();
// other stuff
}
public int Sum(string prefix) => this.Where(kvp => kvp.Key.StartsWith(prefix)).Sum(kvp => kvp.Value);
using System.Linq;
...
int sum = this
.Where(pair => pair.Key.StartsWith(prefix))
.Sum(pair => pair.Value);