0

特定の方法で何かをしようとしていますが、もっと良い方法があると確信しています

public interface IMix
{
    T Mix<T>(List<T> values) where T : IMix;
}

これに関する問題は、5 つの値を「混合」したい場合は、そうする必要がありますvalue1.Mix(others)が、それはきれいではないということです。さらに、 T の型は、インターフェイスを実装するクラスと同じ型である必要があります。したがって、これは実際には機能しません。

私は次のようなことを考えていました:

public static class MixWrapper
{
    public static T Mix<T>(List<T> values);
}

しかし、体を定義する必要があるため、明らかにうまくいきませんMixWrapper

編集:誤解を解くために、これらは実際の数学の平均ではありません。「ヒューズ」などと簡単に言うことができます。たとえば、一部の構造体または他のクラスのリストを「平均化」しようとしている可能性があります。

EDIT 2: 1つの例は、このようなクラスになる可能性があります

class Sequence : IMix
{
    List<int> sequence;
    double period;
    double weight;
}

この場合の "Mix" は、このSequenceように構築された を返す必要があります。結果の期間は、重みに基づく期間の加重平均です。重みは重みの合計であり、シーケンスは結果の期間にタイムスケールダウンされた後のシーケンスの加重平均です。言うまでもなく、考えられる複雑な方法はすべて説明する必要があります

4

3 に答える 3

4

いくつかのリストの平均を計算したい場合は、LINQを使用できます。

var value = list.Average(x => x.SomeProperty);
于 2012-12-25T19:52:17.933 に答える
2

インターフェイスに型Tを配置し、実装するときにクラスと同じ型で埋めるだけです。

public interface IMix<T>
{
    T Mix(List<T> values);
}

public class ConcreteObjects : IMix<ConcreteObjects>
{
    public ConcreteObjects Mix(List<ConcreteObjects> values)
    {
        // do mixing
    }
}

これにより、必要に応じて他のクラスが ConcreteObjects を混合できるようになります。

于 2012-12-25T20:53:31.213 に答える
1

を探していると思いますextension method

次のように、どこかに静的メソッドを定義する必要があります(ヘルパークラスだと思います)。

public static T Average<T>(this List<T> list) where T : IAverage
{
    return // average stuff
}

ヘルパー クラスをインクルードするだけで、次のusingようなことができます AverageClassIAverage

List<IAverage> list = new List<AverageClass>();
var average = list.Average();
于 2012-12-25T20:21:34.047 に答える