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.


Move Circle in Turbo c++

how can we move a circle on the screen in Turbo c++ and without clear device i want to move it from left to right and then to right to left my code is here but it is with clear device which make the screen blink a little so any help???

main() {
  int gd=DETECT,gm,col=0; 
  initgraph(&gd,&gm,"../bgi"); 
START: 
  int get = 0;col=40; 
  while(!kbhit()) 
  { 
    rectangle(20,20,getmaxx()-20,getmaxy()-20);
    circle(col,210,20); 
    delay(5); 
    if(col <600 && get == 0) col++; 
    else{ get=1; col--; } 
    cleardevice(); 
    if(col==40) goto START; 
  } 
}
4

4 に答える 4

14

正確な型が常に数値型になることがわかっている場合は、次のようなものを使用できるはずです。

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

これは、コアの数値型によって実装されているConvert.ToDoubleを探すため、機能します。IConvertibleまた、型を元の型ではなくa にすることを強制してdoubleいます。

于 2013-03-14T18:45:02.650 に答える
4

式ツリーを使用して必要な 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);

これには入力リストが空でないことが必要ですが、結果の要素タイプを保持するという利点があります。

于 2013-03-14T18:51:26.230 に答える
0

1 種類に変換します。10 進数と言います。

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

于 2013-03-14T18:48:35.133 に答える
-1

あなたはダイナミックを使うことができます、完璧に動作します:

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