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

编辑:为了消除一些误解,这些不是真正的数学平均值,我可以很容易地说“保险丝”或其他任何东西。例如,我可能会尝试对某个结构或其他类的列表进行“平均”。

编辑2:一个例子可能是这样的类

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

在这种情况下,“混合”需要返回以Sequence这种方式构建的 a:生成的周期是基于权重的周期的加权平均值。权重是权重的总和,序列是序列在时间按比例缩小到结果周期后的加权平均值。可以说,任何你能想到的复杂方法都需要考虑

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你可以做这样的事情: AverageClass实现IAverage

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