C# 如何获得IEnumerable的linq和<;对象>;
如何获取IEnumerable对象集合中的数字之和?我确信基础类型将始终是数值类型,但类型是在运行时确定的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<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);