2012-04-21 11 views
12

He mirado todo pero no puedo resolverlo. ¿Cómo se suma una lista de BigIntegers?Suma una lista de BigIntegers

Using System.Numerics; 
Using System.Linq; 

List<BigInteger> bigInts = new List<BigInteger>(); 
BigInteger sum = bigInts.Sum();    // doesn't work 
BigInteger sum = bigInts.Sum<BigInteger>(); // doesn't work 
BigInteger sum = bigInts.Sum(x => x);  // doesn't work 

¿Tienes que hacer esto?

BigInteger sum = new BigInteger(0); 
foreach(BigInteger bigint in bigInts) 
    sum += bigint; 

Respuesta

7

Aggregate función es la versión más general de la Suma:

var bigInts = new List<System.Numerics.BigInteger>(); 
bigInts.Add(new System.Numerics.BigInteger(1)); 

var result = bigInts.Aggregate((currentSum, item)=> currentSum + item)); 
+7

O simplemente 'bigInts.Aggregate (BigInteger.Add)' :) – leppie

+0

Alexei, Esto es exactamente lo que usé tan pronto como pones tu respuesta, busqué cómo usar Aggregate. @leppie, ¿podrías agregar alguna explicación sobre cómo funciona tu magia? –

+0

@jb .: Es solo un delegado que hace referencia al método 'BigInteger.Add'. – leppie

0

Como Alexei dicho agregado es la más general a partir de la suma. presentado a continuación es un método de extensión.

public BigInteger static Sum(IEnumerable<BigInteger> this lst) 
{ 
    return lst.Aggregate(BigInteger.Zero, (acc, next)=> acc.Add(next)); 
} 

No he probado esto, y mi C# podría estar un poco oxidada. pero la idea debe ser sólida: ver http://msdn.microsoft.com/en-us/library/bb549218.aspx#Y0

+1

Es posible que desee tener un tipo de devolución y devolver algo. – leppie

+0

Oh, veo mientras escribía este @Alexei Levenkov, actualicé su respuesta para incluir un ejemplo. grandes mentes piensan igual –

+0

leppie, Ah sí. Demasiado usando F # para mí. se olvidó de esos. Corregido ahora –

0

También puede utilizar el método ForEach() en las listas genéricas de hacer la adición:

var bigInts = new List<BigInteger>(); 

BigInteger sum = 0; 
bigInts.ForEach(x => sum += x); 
+0

Pensé en esto, pero todavía requiere un BigInteger extra. Y tendría que hacer '.ToList()' si estoy en un 'IEnumerable '. (Lo cual soy, pero olvidé mencionar) –

+0

Ah, bien entonces, eso hace una pequeña diferencia. (-: –

11
var sum = bigInts.Aggregate(BigInteger.Add); 

agregado consigue un delegado a un método que obtiene dos BigIntegers y devuelve un BigInteger. Utiliza un BigInteger predeterminado como valor inicial (0), y pasa por encima de cada BigInteger, invocando BigInteger.Add con el resultado anterior (0 sería el resultado anterior en la primera vez, también llamado 'semilla') y el elemento actual.

+0

¡Yorye! ¡Bienvenido! :) –

+0

Lol. ¡Igualmente! ¿En qué preguntas estás ahora? ; P – SimpleVar

+0

El valor inicial no es realmente necesario cuando se trata de 'Agregar'. – leppie

Cuestiones relacionadas