将 IEnumerable<int> 中的所有值相乘

Posted

技术标签:

【中文标题】将 IEnumerable<int> 中的所有值相乘【英文标题】:Multiplying all values in IEnumerable<int> 【发布时间】:2011-04-12 01:44:28 【问题描述】:

我有以下代码,我正在尝试解决如何将 IEnumerable&lt;int&gt; 中的所有值相乘。

我认为可能有像 Sum 那样的 Multiply 方法。我想我可以对每个项目进行一次 foreach,但现在这似乎很乏味。

有什么建议吗?

//1:2:6
string[] pkgratio = comboBox1.SelectedRow.Cells["PkgRatio"].Value.ToString().Split(':');
var ints = pkgratio.Select(x => int.Parse(x));         

int modvalue = ints....

【问题讨论】:

【参考方案1】:

您正在寻找的是聚合函数

int modValue = ints.Aggregate(1, (x,y) => x * y);

Aggregate 函数接受一个初始累加器值,然后对枚举中的每个值应用一个操作,创建一个新的累加器值。这里我们从 1 开始,然后将 ever 值乘以累加器的当前值。

注意:如果 ints 值为空,则返回 1。这可能适合您的情况,也可能不适合您的情况。

【讨论】:

谢谢。我刚试过 ints.Aggregate(1, (x,y) => x + y);对于 1,2,6,它加起来是 10。我猜那是因为它从一开始就加了 1。但是乘法就可以了吗?? @Jon:是的。您也可以完全省略种子并执行ints.Aggregate((x,y) =&gt; x * y),但如果您为其提供一个空序列,则会引发异常。 我刚试过,即使种子在空序列上,它仍然会抛出异常 仅供参考,如果您使用的是浮点数而不是整数,您可能希望将“1”更改为“1.0”或将其转换为您的实际类型,否则您会得到编译器错误。事后看来似乎很明显,但我花了几分钟摸摸头绪,并认为我会分享这个以希望其他人不必这样做。 谢谢,正是我一直在寻找的!

以上是关于将 IEnumerable<int> 中的所有值相乘的主要内容,如果未能解决你的问题,请参考以下文章

将 IEnumerable<int> 中的所有值相乘

在 C# 中将 List<IEnumerable<int>> 转换为 List<int> [重复]

如何从客户端接收 IEnumerable<int>? [复制]

尝试在 C# 中迭代​​ IEnumerable<int> 时,指定的强制转换无效

具有键“XXX”的 ViewData 项属于“System.Int32”类型,但必须属于“IEnumerable<SelectListItem>”类型

具有键“CategoryId”的 ViewData 项的类型为“System.Int32”,但必须为“IEnumerable<SelectListItem>”类型?