C#将每个循环的格式设置为Lambda

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)

我刚开始学习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) {
        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);