我正试图以某种方式做某事......但我确信有更好的方法
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
:结果期间是基于权重的期间的加权平均值。权重是权重的总和,并且序列是在将时间尺度缩减到结果周期之后的序列的加权平均值。可以说,任何你能想到的复杂方法都需要考虑
答案 0 :(得分:4)
如果您想计算某些列表的平均值,则可以使用LINQ:
var value = list.Average(x => x.SomeProperty);
答案 1 :(得分: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。
答案 2 :(得分: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();