求和所有使用LINQ的字符串数组中的数字的字符串

问题描述 投票:-1回答:3

我有一个字符串数组,其中包含...字符串,其中一些是数字。我希望使用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();

但是我想知道是否有某种方式可以以某种方式将WhereSelect子句组合在一起?

谢谢!

c# linq
3个回答
4
投票

您不能将WhereSelect组合在一起,但是可以将其更改为仅解析一次字符串

var sum = array
    .Select(text => (IsNumber: int.TryParse(text, out var number), Number: number))
    .Where(value => value.IsNumber)
    .Sum(value => value.Number);

完成Sum中所有内容的另一种方法>

var sum = array.Sum(text => int.TryParse(text, out var number) ? number : 0);

实际上,您可以合并Where和Select子句

,仅是因为您计算了总和。对于无效数字的文本,返回0。
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;
}

2
投票

在这种情况下,您可以使用Aggregate


0
投票

您可以在不使用array.Aggregate(0, (acc, s) => int.TryParse(s, out var val) ? acc + val : acc) 的情况下将数字解析包装到Select中>

Where
© www.soinside.com 2019 - 2024. All rights reserved.