Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何获得IEnumerable的linq和<;对象>;_C#_.net_Generics_Reflection - Fatal编程技术网

C# 如何获得IEnumerable的linq和<;对象>;

C# 如何获得IEnumerable的linq和<;对象>;,c#,.net,generics,reflection,C#,.net,Generics,Reflection,如何获取IEnumerable对象集合中的数字之和?我确信基础类型将始终是数值类型,但类型是在运行时确定的 IEnumerable<object> listValues = data.Select(i => Convert.ChangeType(property.GetValue(i, null), columnType)); 有什么想法吗?谢谢。如果您知道确切的类型始终是数字类型,那么您应该能够使用以下内容: double total = listValues.Sum(v

如何获取IEnumerable对象集合中的数字之和?我确信基础类型将始终是数值类型,但类型是在运行时确定的

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

有什么想法吗?谢谢。

如果您知道确切的类型始终是数字类型,那么您应该能够使用以下内容:

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

这将起作用,因为
Convert.ToDouble
将查找,这是由核心数字类型实现的。您正在强制该类型为双精度类型,而不是原始类型。

转换为一种类型。说,十进制

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


您可以使用表达式树生成所需的add函数,然后折叠输入列表:

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);
private static Func genadfunc(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));
返回Expression.Lambda(Expression.Convert(addExpr,typeof(object)),param1Expr,param2Expr.Compile();
}
IEnumerable列表值;
Type elementType=listValues.First().GetType();
var addFunc=GenAddFunc(elementType);
对象总和=listValues.Aggregate(addFunc);

注意:这要求输入列表为非空,但它的优点是保留结果中的元素类型。

您可以使用dyanmic,非常适合:


为什么确切的类型是在运行时确定的?听起来很可疑!如果类型是在运行时确定的,那听起来像是泛型的工作。你有权创建
IEnumerable列表值吗?你能将其更改为
IEnumerable,其中T:struct,IConvertible
?@Tory-是的,我有权创建T他是IEnumerable,但我不知道如何做出您建议的更改。我是泛型领域的新手,请提供一个示例,谢谢。请记住,这可能会对字符串和其他对象抛出一个
InvalidCastException
。@ebebebe-这是真的,调用之前的代码确保只使用数值类型到此为止。Reed-您的解决方案很简单,工作正常,但我想保留原始类型。@Mike问题是无法指定编译时类型,甚至无法正确设置变量。您可以(潜在地)把它放在一个
对象中,但那不是很有用…你的解决方案工作得很好!只是试图理解整个概念。谢谢。在我的场景中,这个解决方案只在基础类型为int时有效。
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);
    listValues.Sum(x => (dynamic)x);