如何对List <object>中的整数项求和?

时间:2018-06-26 06:17:59

标签: c# linq

如何在代码中找到总和整数?

List<object> lst = new List<object> { "c#", 12, "Simi", 236.5, 17, "Asp.net", 98 };
lst.Where(c => c is int).ToList().Sum();

lst.Where(c => c is string).ToList().Max(d => d.ToString().Length);

3 个答案:

答案 0 :(得分:8)

我建议更改:

lst.Where(c => c is int).ToList().Sum();

收件人:

var sum = lst.OfType<int>().Sum();

{OfType<int>将确保仅考虑整数(例如,字符串将被忽略),而Sum将对其求和。

答案 1 :(得分:1)

您可以这样做

lst.Sum(c => c is int ? (int)c : 0)

答案 2 :(得分:0)

尽管提供的其他答案足够有效,但我想提供一个详尽的答案,以帮助您获得不仅仅是当前C#语法水平的帮助。例如; Linq无法使用prior to 3.5

IS关键字

  

检查对象是否与给定类型兼容,或者(从C# 7.0开始)针对模式测试表达式。

LINQ

  

LINQ引入的许多概念最初都是在Microsoft的研究项目中进行测试的。 LINQ于2007年11月19日作为.NET Framework 3.5的主要部分发布。

原始金额

一次完成所有操作的原始版本将是编写一个返回double值但接受List<object>值的方法。我之所以选择double是因为它的±5 * 10^-324 - ±1.7 * 10^308最大范围非常之大。 double类型能够实现所提供的所有值的总和,并且可以减少但不会消除发生溢出的风险。甚至double都有最小值和最大值。我试图解释这个问题;但是,我所能做的就是让异常回溯到实现中。

public double SumNumericsFromListOfObjects(List<object> objects) {
    double sum = 0;
    foreach (object o in objects) {
        double val = 0;
        if (double.TryParse(o.ToString(), out val)
            sum += val;
    }
    return sum;
}

// Usage:
private void DoSomeCoolStuff() {
    List<object> myObjects = new List<object>();
    object[] objects = new object[] { 12, 32, 1, 9, "5", "18", 3.14, "9.9", false };
    myObjects.AddRange(objects);

    double sumOfObjects = SumNumericsFromListOfObjects(myObjects);
    int iSum = 0;
    long lSum = 0;
    if (sumOfObjects < int.MaxValue)
        iSum = (int)sumOfObjects;
    else if (sumOfObjects > int.MaxValue && sumOfObjects < long.MaxValue)
        lSum = (long)sumOfObjects;
    else
        // You just have to use the double type at this point.
}

以上示例应处理对象列表中的大多数情况。授予原始职位明确指出,应该对类型为int的对象进行求和,并且并未真正指定应考虑string值还是double值,也不应该指定如何处理它们。我个人认为最好处理所有案件。因此,由于string的值如果满足特定条件就可以解析为double的值,并且双精度数可以转换回整数(假设它们的值不超过int的最大值),我决定在double级别求和,然后在该方法的实现处转换回整数,以确保不会遗漏任何数值。上面的方法应该能够处理以下types

byte:0-255

sbyte:-128-127

short:-32768-32767

ushort:0-65535

int:-2147483648-2147483647

uint:0-4294967295

long:-9 * 10 ^ 18-9 * 10 ^ 18

ulong:0-1.8 * 10 ^ 19

float:±1.5 * 10 ^ -45-±3.4 * 10 ^ 38

double:±5 * 10 ^ -324-±1.7 * 10 ^ 308

decimal:±10 ^ -28-±7.9 * 10 ^ 28

扩展方法

如果您发现自己经常从对象列表中添加值,那么另一种快速而有效的方法是将extension methods添加到List<object>类型。请记住,此方法还可能溢出执行该算法的类型的最小值和最大值。

internal class Extensions {
    public static double Sum(this List<object> objects) {
        double sum = 0;
        foreach (object o in objects) {
            double val = 0;
            if (double.TryParse(o.ToString(), out val))
                sum += val;
        }
        return sum;
    }
}

// Usage:
double sum = myObjects.Sum();

如果有人觉得我遗漏了一些有用的信息,或者在这里做错了什么,请随时发表评论并通知我,以便我可以更新此帖子,以更好地教育未来的读者。