2

私の質問に加えて

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

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

リストの合計に対するリスト項目のパーセンテージを生成する.Net 4.0で汎用拡張メソッドを作成したいと考えています。このリストは数値型のみです。

私のコードは

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'
}

みたいに呼びたい

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(); 

私は何を間違っていますか;

4

3 に答える 3

4

必要なタイプの制約を持つことはできません。詳細については、ジェネリック型引数を数値型に制限するをご覧ください。

数値型 (int/float/double/decimal) はそれほど多くないため、具体的な実装を単純に提供する方が簡単な場合があります。

より多くのオプション

于 2012-04-21T07:04:49.233 に答える
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();
}

基本的に、サポートする型ごとにオーバーロードを生成する必要があります。

于 2012-04-21T07:08:28.463 に答える
1

Percentage を呼び出すときに double に変換できるようにするセレクター関数を渡すという別の方法があります。これは拡張メソッドです:

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();
于 2012-04-21T07:12:30.577 に答える