2012-04-21 12 views
12

Ho cercato ovunque ma non riesco a capirlo. Come riassumi un elenco di BigIntegers?Sommare un elenco di 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 

Devi farlo?

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

risposta

7

Aggregate funzione è la versione più generale di Somma:

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

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

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

+0

Alexei, Questo è esattamente ciò che ho usato non appena hai inserito la tua risposta, ho cercato come usare Aggregate. @leppie, potresti aggiungere qualche spiegazione su come funziona la tua magia? –

+0

@jb .: È solo un delegato, facendo riferimento al metodo 'BigInteger.Add'. – leppie

0

Come Alexei detto aggregato è il più generale dalla somma di. Di seguito è riportato un metodo di estensione.

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

non ho ancora testato questo, e il mio C# potrebbe essere sempre un po 'arrugginito. ma l'idea deve essere sana: vedere http://msdn.microsoft.com/en-us/library/bb549218.aspx#Y0

+1

Potresti voler avere un tipo di ritorno e restituire qualcosa. – leppie

+0

Oh capisco mentre stavo scrivendo questo @Alexei Levenkov, ho aggiornato la sua risposta per fare un esempio. grandi menti pensano allo stesso modo –

+0

leppie, Ah si. Troppo usando F # per me. dimenticato di quelli. Risolto il problema –

0

È inoltre possibile utilizzare il metodo ForEach() su liste generiche per fare l'aggiunta:

var bigInts = new List<BigInteger>(); 

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

Ci ho pensato, ma richiede ancora un BigInteger in più. E dovrei fare '.ToList()' se sono in un 'IEnumerable '. (Che io sia, ma ho dimenticato di menzionare) –

+0

Ah, beh allora, questo fa una leggera differenza. (-: –

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

Aggregate ottiene un delegato a un metodo che ottiene due BigIntegers e restituisce un BigInteger. Usa un BigInteger predefinito come valore iniziale (0), e passa a ogni BigInteger, invocando BigInteger.Add con il risultato precedente (0 sarebbe il risultato precedente nella prima volta - chiamato anche "seme") e l'elemento corrente.

+0

Yorye! Bentornato! :) –

+0

Lol. Allo stesso modo! A che domanda stai ora? ; P – SimpleVar

+0

Il valore iniziale non è realmente necessario quando si ha a che fare con 'Aggiungi'. – leppie