2012-04-21 32 views
12

Tôi đã xem xét tất cả nhưng không thể tìm ra điều này. Làm thế nào để bạn tổng hợp một danh sách các BigIntegers?Tổng hợp danh sách các 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 

Bạn có phải làm điều này không?

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

Trả lời

7

Aggregate chức năng là phiên bản tổng quát hơn của Sum:

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

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

Hoặc chỉ 'bigInts.Aggregate (BigInteger.Add)' :) – leppie

+0

Alexei, Đây chính xác là những gì tôi đã sử dụng ngay khi bạn đưa ra câu trả lời, tôi đã tìm cách sử dụng Tổng hợp. @leppie, bạn có thể thêm một số giải thích làm thế nào ma thuật của bạn hoạt động? –

+0

@jb .: Nó chỉ là một đại biểu, tham khảo phương thức 'BigInteger.Add'. – leppie

0

Như Alexei cho biết tổng hợp là tổng quát hơn từ các khoản tiền. Trình bày dưới đây là một phương pháp mở rộng.

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

Tôi chưa thử nghiệm điều này và C# của tôi có thể bị gỉ một chút. nhưng ý tưởng nên âm thanh: thấy http://msdn.microsoft.com/en-us/library/bb549218.aspx#Y0

+1

Bạn có thể muốn có kiểu trả về và trả về một cái gì đó. – leppie

+0

Ồ, tôi thấy khi tôi đang gõ @Alexei Levenkov này, hãy cập nhật câu trả lời của anh ấy để nói một ví dụ. tâm trí tuyệt vời nghĩ như nhau –

+0

leppie, Ah vâng. Quá nhiều bằng cách sử dụng F # cho tôi. quên đi những thứ đó. Sửa lỗi ngay bây giờ –

0

Bạn cũng có thể sử dụng phương pháp ForEach() trên danh sách chung để làm việc bổ sung:

var bigInts = new List<BigInteger>(); 

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

Tôi nghĩ về điều này, nhưng nó vẫn đòi hỏi một BigInteger thêm. Và tôi phải làm '.ToList()' nếu tôi đang ở trong một 'IEnumerable '. (Tôi là ai, nhưng quên đề cập đến) –

+0

Ah, sau đó, điều đó tạo nên sự khác biệt nhỏ. (-: –

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

tổng hợp được một đại biểu đến một phương pháp mà được hai BigIntegers và trả lại một BigInteger. Nó sử dụng một BigInteger mặc định làm giá trị ban đầu (0), và đi qua mỗi BigInteger, gọi BigInteger.Add với kết quả trước đó (0 sẽ là kết quả trước đó trong lần đầu tiên - còn được gọi là 'seed') và phần tử hiện tại.

+0

Yorye! Chào mừng trở lại! :) –

+0

Lol. Tương tự như vậy! Bạn đang có câu hỏi gì? P – SimpleVar

+0

Giá trị ban đầu không thực sự cần thiết khi giao dịch với 'Thêm'. – leppie