2012-04-21 18 views
2
私の質問にさらに

私のジェネリックExtensionメソッドにTから変換.....または.... T

https://stackoverflow.com/questions/10241345/any-percentage-function-in-net

https://stackoverflow.com/questions/9942202/percentage-of-each-element-in-linq

に私はジェネリックを作成することができないと言うのはなぜ.Net 4.0の拡張メソッドで、リスト項目のパーセンテージをリストの合計に生成します。このリストは数値タイプのみです。

私のコードは私が間違って何をやっている

double[] MD = {8.0,21.0,25.0,13.0,26.0,37.0,37.0,33.0,71.0,9.0}; 

MD = MD.Percentage().ToArray(); 

ようにそれを呼びたい

public static T Percentage<T>(this T array) where T: ? // What should come in place of ? 
{ 
    double[] darray = (double[])T; // Error convert type 'T' to 'double[]' 

    darray = darray.Select(x=> x * 100/darray.Sum()).ToArray(); 

    return darray; // Error convert type 'double[]' to 'T' 
} 

です。

答えて

4

タイプを「数値」値で制約することはできません。それはフレームワークの幾分限定です。

あなたの最高の最高は、これを行うことです。

public static IEnumerable<double> Percentage(this IEnumerable<int> values) 
{ 
    var sum = values.Sum(); 
    return values.Select(v => (double)v/(double)sum).ToArray(); 
} 

public static IEnumerable<double> Percentage(this IEnumerable<long> values) 
{ 
    var sum = values.Sum(); 
    return values.Select(v => (double)v/(double)sum).ToArray(); 
} 

public static IEnumerable<double> Percentage(this IEnumerable<double> values) 
{ 
    var sum = values.Sum(); 
    return values.Select(v => v/sum).ToArray(); 
} 

基本的にあなたがサポートする各タイプの過負荷を生成する必要があります。

4

あなたが望むタイプの拘束はできません。詳細はConstraining a generic type argument to numeric typesをご覧ください。

数値型が多すぎないので(int/float/double/decimal)、具体的な実装を簡単に提供する方が簡単です。

オプション

1

パーセンテージを呼び出すときに倍精度に変換できるセレクタ関数を渡す代替方法があります。これは、拡張メソッドです:

public static double[] Percentage<T>(this T[] array, Func<T,double> selector) 
{ 
    var doubles = array.Select(selector); 
    var sum = doubles.Sum(); 

    var result = doubles.Select(x => x * 100/sum).ToArray(); 

    return result; 
} 

使用法:

double[] MD = {8.0,21.0,25.0,13.0,26.0,37.0,37.0,33.0,71.0,9.0}; 
var MDPercent = MD.Percentage(x => x).ToArray(); 

そしてあなたは、単純な二重のバージョン持つことができます。

public static double[] Percentage(this double[] array) 
{ 
    return Percentage(array, x => x); 
} 

またはINTバージョン:

public static double[] Percentage(this int[] array) 
{ 
    return array.Percentage(x => (double)x); 
} 

使用するのが簡単です:

var MDPercent = MD.Percentage().ToArray(); 
関連する問題