2016-02-24 17 views
5

Đối với C# Enumerable.Sum<TSource> Method (IEnumerable<TSource>, Func<TSource, Int64>) không hỗ trợ ulong nhập làm loại trả về của Mehtonf trừ khi tôi chuyển ulong thành long.C# Enumerable.Sum Phương pháp không hỗ trợ loại ulong

public class A 
{ 
    public ulong id {get;set;} 

} 




publec Class B 
{ 
    public void SomeMethod(IList<A> listOfA) 
    { 
     ulong result = listofA.Sum(A => A.Id); 
    } 
} 

Các compliler sẽ ném hai lỗi:

  1. enter image description here
  2. enter image description here

    trừ khi tôi làm

ulong result = (ulong)listOfA.Sum(A => (long)A.Id)

Có cách nào để giải quyết điều đó mà không cần truyền? Cảm ơn!

Trả lời

9

Thay vào đó, bạn có thể sử dụng Aggregate.

ulong result = listOfULongs.Aggregate((a,c) => a + c); 

Hoặc trong trường hợp cụ thể của bạn

ulong result = listOfA.Aggregate(0UL, (a,c) => a + c.Id); 

Bạn cũng nên xem xét nếu bạn thực sự nên sử dụng một loại giá trị unsigned ở nơi đầu tiên.

+0

Cảm ơn, điều đó dường như là một cách tốt đẹp của việc giải quyết vấn đề. Lý do tôi đang sử dụng 'ulong' là bởi vì một Id không thể là tiêu cực. Bạn có nghĩ rằng tôi thực sự nên sử dụng 'long' thay thế? –

+1

@ Z.Z. - Nếu bạn không giao dịch với số âm và kết quả của tổng của bạn vượt quá '9,223,372,036,854,775,807', nhưng không vượt quá' 18,446,744,073,709,551,615' thì 'ulong' là một ý tưởng hay. Nếu không 'long' là một lựa chọn hoàn hảo. – Enigmativity

4

Bạn có thể viết phương pháp khuyến nông của riêng bạn để cung cấp sự quá tải cho ulong vì nó không được cung cấp như một phần của BCL:

public static ulong Sum<TSource>(
    this IEnumerable<TSource> source, Func<TSource, ulong> summer) 
{ 
    ulong total = 0; 

    foreach(var item in source) 
     total += summer(item); 

    return total; 
} 
+0

Câu trả lời hay, nhưng điều này cho phép lỗi trình biên dịch "CS0165 Sử dụng biến cục bộ chưa được gán" tổng cộng ". Bạn cần phải chắc chắn gán 'tổng số'. – Enigmativity

+0

Cảm ơn vì điều đó, tôi đã viết mã trong SO và không chạy nó thông qua một trình biên dịch, tôi sẽ cập nhật nó. –

+0

Cảm ơn bạn đã trả lời! Phương pháp mở rộng có vẻ là một giải pháp tốt đẹp! –

Các vấn đề liên quan