8

How do I get the sum of numbers that are in an IEnumerable collection of objects? I know for sure that the underlying type will always be numeric but the type is determined at runtime.

IEnumerable<object> listValues = data.Select(i => Convert.ChangeType(property.GetValue(i, null), columnType));

After that I want to be able to do the following (the following has the error:"Cannot resolve method Sum"):

var total = listValues.Sum();

Any ideas? Thank you.


If you know the exact type is always going to be a numeric type, you should be able to use something like:

double total = listValues.Sum(v => Convert.ToDouble(v));

This will work because Convert.ToDouble will look for IConvertible, which is implemented by the core numeric types. You are forcing the type to be a double and not the original type, as well.

4

4 回答 4

14

如果你知道确切的类型总是数字类型,你应该能够使用类似的东西:

double total = listValues.Sum(v => Convert.ToDouble(v));

这将起作用,因为Convert.ToDouble将查找IConvertible由核心数字类型实现的 。您也将类型强制为 adouble而不是原始类型。

于 2013-03-14T18:45:02.650 回答
4

You can use expression trees to generate the required add function, then fold over your input list:

private static Func<object, object, object> GenAddFunc(Type elementType)
{
    var param1Expr = Expression.Parameter(typeof(object));
    var param2Expr = Expression.Parameter(typeof(object));
    var addExpr = Expression.Add(Expression.Convert(param1Expr, elementType), Expression.Convert(param2Expr, elementType));
    return Expression.Lambda<Func<object, object, object>>(Expression.Convert(addExpr, typeof(object)), param1Expr, param2Expr).Compile();
}

IEnumerable<object> listValues;
Type elementType = listValues.First().GetType();
var addFunc = GenAddFunc(elementType);

object sum = listValues.Aggregate(addFunc);

note this requires the input list to be non-empty, but it has the advantage of preserving the element type in the result.

于 2013-03-14T18:51:26.230 回答
0

convert to one type. Say, decimal.

data.Select(i => Convert.ToDecimal(property.GetValue(i, null)).Sum();

于 2013-03-14T18:48:35.133 回答
-1

you can use dyanmic, works perfect:

    listValues.Sum(x => (dynamic)x);
于 2013-03-14T20:58:24.730 回答