C# 将 foreach 循环格式化为 Lambda

Rüd*_*ger 4 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) {
        int sum = 0;

        foreach (String key in base.Keys) {
            if (key.StartsWith(prefix)) {
                sum = sum + base[key];
            }
        }

        return sum;
    }
}
Run Code Online (Sandbox Code Playgroud)

现在我想用 lambda 表达式缩短代码的以下部分:

        foreach (String key in base.Keys) {
            if (key.StartsWith(prefix)) {
                sum = sum + base[key];
            }
        }
Run Code Online (Sandbox Code Playgroud)

我试过:

new List<String>(base.Keys).ForEach(key => key.StartsWith(prefix) ? sum = sum + base[key] : sum = sum);
Run Code Online (Sandbox Code Playgroud)

然而我遇到了这个错误:CS0201

我来自 Java,我不太明白为什么它不起作用。谁能解释我应该以不同的方式做些什么(以及为什么)?

Kri*_*ica 6

这仅在过滤后至少有一个元素时才有效。

base.Keys
   .Where(key=> key.StartsWith(prefix))
   .Sum(base[key])
Run Code Online (Sandbox Code Playgroud)

如果可以没有(该方法不能求和),您可以使用它,DefaultIfEmpty因此您的总和为 0。

base.Keys
   .Where(key=> key.StartsWith(prefix))
   .Select(key=> base[key])
   .DefaultIfEmpty(0)
   .Sum()
Run Code Online (Sandbox Code Playgroud)

出于性能原因,您可能希望避免使用索引器,而是自己迭代字典。

var defaultZero = new KeyValuePair<string, int>(string.Empty, 0);
var sum = this
          .Where(pair => pair.Key.StartsWith(prefix))
          .DefaultIfEmpty(defaultZero)
          .Sum(pair => pair.Value);
Run Code Online (Sandbox Code Playgroud)

如果您需要单独处理没有元素的情况,您可以执行以下操作

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
}
Run Code Online (Sandbox Code Playgroud)