C# 如何对foreach循环中的值求和

C# 如何对foreach循环中的值求和,c#,C#,我有一个foreach循环,我试图总结所有产生的值 foreach (var v in medals) { v2 = Regex.Replace(v.value.Trim('"').ToLower(), "Gold", "100") .Replace("Silver", "75") .Replace("Bronze", "50"); } 我试着把100、75和50加起来,所以显示的总数是225。试试这个 int total = 0; foreach

我有一个
foreach
循环,我试图总结所有产生的值

foreach (var v   in medals)
{
    v2 = Regex.Replace(v.value.Trim('"').ToLower(), "Gold", "100")
        .Replace("Silver", "75")
        .Replace("Bronze", "50");
}
我试着把100、75和50加起来,所以显示的总数是225。

试试这个

int total = 0;
foreach (var v   in medals)
            {
                v2 = Regex.Replace(v.value.Trim('"').ToLower(), "Gold", "100")
                    .Replace("Silver", "75")
                    .Replace("Bronze", "50");
                total += int.Parse(v2);
            }​

您只需将
v
的当前值添加到
foreach
循环之外声明的单独变量中,这样您就可以将v的所有传入值的总和保留到循环范围之外的变量中,如另一个答案所示。

如果奖牌中的元素是仅包含单词的简单字符串“gold、silver和brown”则不需要使用正则表达式,简单的if可以更简单地编码和理解

int v2 = 0;
foreach (var v   in medals)
{
    string temp = v.ToLower();
    if(temp == "gold")
        v2 += 100;
    else if(temp == "silver")
        v2 += 75;
    else if(temp == "bronze")
        v2 += 50;
}
Console.WriteLine("Total is:" + v2.ToString());
如果你想尝试LINQ中的一行

var total = medals.Sum(x => x.ToLower() == "gold" ? 100 : x.ToLower() == "silver" ? 75 : 50);

(虽然不是很有效,但是使用ToLower调用一次的常用foreach循环更好)

您的奖牌集合可能是一个字典(在您的代码中,您在循环v.Value中使用),因此如果v.Value是一个字符串,那么您可以使用stringComparer为映射创建一个字典,然后在Sum()中使用它:

字典值=新字典
(StringComparer.CurrentCultureInogoreCase)
{
{“黄金”,100},
{“银”,75},
{“青铜”,50}
};
int result=aclements.Sum(v=>values.ContainsKey(v.Value)?values[v.Value]:0);

此代码假定奖牌集合是一个字典。

什么是
v2
?您希望通过输出实现什么?为什么只在第一次替换时使用正则表达式,而不在后续替换时使用正则表达式?ToLower()但是,正如帕特里克霍夫曼所说的那样,你可以与GoldAs进行比较,但更重要的是,你真的需要正则表达式吗?奖牌的原始价值是什么?如果它们只是一个词(金、银或铜),那么正则表达式就完全没有必要了。“为什么代码不起作用?”问题要求:输入、代码、预期输出加上编译/运行时错误消息或对意外行为的解释。这篇文章缺少了至少一半的好问题的必要部分。带有不区分大小写比较的字典将使LINQ版本更加紧凑。
Dictionary<string,int> values = new Dictionary<string,int>
                 (StringComparer.CurrentCultureIgnoreCase)
{
     {"gold",100},
     {"silver",75},
     {"bronze",50}
};

int result = medals.Sum(v => values.ContainsKey(v.Value) ? values[v.Value] : 0);