2013-09-23 70 views
6

我需要編寫一些我稱之爲Aggregation Container的存儲Aggregations的內容,這些Aggregation本質上是Actions,它將一組對象作爲結果輸出並輸出一個對象。聚合的例子是:算術平均值,一組數字的中間值,諧波平均值等。下面是一個示例代碼。聚合以及如何檢查我們是否可以求和對象

var arithmeticMean = new Aggregation 
     { 
      Descriptor = new AggregationDescriptor { Name = "Arithmetic Mean" }, 
      Action = (IEnumerable arg) => 
      { 
       double count = 0; 
       double sum = 0; 

       foreach (var item in arg) 
       { 
        sum += (double)item; 
        count++; 
       } 

       return sum/count; 
      } 
     }; 

這是我的代碼問題。我認爲這些物體只是雙倍,因此進行了轉換。如果他們不是雙倍的呢?我怎樣才能確保我被允許總結兩個對象?標準.Net程序集中是否有某種接口?我需要一些類似於ISummable的東西......或者我需要自己實現它(然後我將不得不包裝所有基本類型,如double,int等等來支持它)。

任何有關此類功能設計的建議都將有所幫助。

+1

的問題不在於你需要確定一個集合是否「可以和」。所有的數值都是固有的。你應該問的問題是「是否是一組數字?」。您可以嘗試爲不同的數值類型提供強類型的「Action」變體,或者在'arg'上運行。 – Jon

+0

喬恩,謝謝你的回覆。我知道,我給出的例子都是數字...但我真的想寫一些更通用和有用的東西。我不想在那裏寫一堆運行時間轉換,但是我建議一組具有不同類型參數的動作可以在這裏工作...... –

+3

看看Enumerable方法 - 它有一組通用方法,支持:'Sum ,Sum ,Sum ,Sum >''這是使類型參數爲'可以和'的唯一方法 –

回答

3

就以Enumerable類方法一看 - 它設定了它所支持的每種類型的參數化方法:

int Sum(this IEnumerable<int> source) 
double Sum(this IEnumerable<double> source) 
decimal Sum(this IEnumerable<decimal> source) 
long Sum(this IEnumerable<long> source) 
int? Sum(this IEnumerable<int?> source) 
// etc 

這使方法參數是「可積」的唯一途徑。

不幸的是,你不能創建一些泛型的方法type parameter constraint,這將允許只有類型+運算符重載。 .NET中的運算符沒有限制,運算符也不能成爲某個接口的一部分(因此它們是靜態的)。所以,你不能使用泛型類型變量的運算符。

另外,如果你會看在.NET基本類型的定義,你會不會在這裏找到任何接口,它可以幫助你 - 只有比較,格式轉換和實施:

public struct Int32 : IComparable, IFormattable, IConvertible, 
         IComparable<int>, IEquatable<int> 
0

您可以通過修改Action財產類,如:

public Func<IEnumerable<double>, double> Action { get; set; } 

所以它只會除了IEnumerable<double>並返回double結果。

+0

我實際上正在試圖從集合的類型中抽象出來,這樣我就可以總結任何可以總結出來的東西。 –

+1

@ george.zakaryan然後您可以爲Action創建2個重載:'Action(IEnumerable )'和'Action(IEnumerable )',其中ISummable應該是您的接口。雙重隱式轉換爲任何其他數字類型。 – selfnamed

相關問題