我有一个字符串数组,其中包含...字符串,其中一些是数字。我希望使用LINQ只对字符串中的数字求和。
我想出了这个:
var array = new string[] { "asd", "asd", "53", null, "51", "asd" };
int sum = array.Where(x => int.TryParse(x, out _)).Select(x => int.Parse(x)).Sum();
但是我想知道是否有某种方式可以以某种方式将Where
和Select
子句组合在一起?
谢谢!
您不能将Where
和Select
组合在一起,但是可以将其更改为仅解析一次字符串
var sum = array
.Select(text => (IsNumber: int.TryParse(text, out var number), Number: number))
.Where(value => value.IsNumber)
.Sum(value => value.Number);
完成Sum
中所有内容的另一种方法>
,仅是因为您计算了总和。对于无效数字的文本,返回0。var sum = array.Sum(text => int.TryParse(text, out var number) ? number : 0);
实际上,您可以合并Where和Select子句
var sum = array .Select(text => { int.TryParse(text, out var number); return number; }) .Sum();
您可以更进一步,为
string
创建扩展方法。这样会使表达式更简单
public static int ParseOrDefault(string value)
{
int.TryParse(text, out var number);
return number;
}
在这种情况下,您可以使用Aggregate
:
您可以在不使用array.Aggregate(0, (acc, s) => int.TryParse(s, out var val) ? acc + val : acc)
的情况下将数字解析包装到Select
中>
Where