2 回答
TA贡献1799条经验 获得超9个赞
由于您显然在类中定义了一些字段或属性,可以对其进行汇总以获得平均值,因此可以选择在构造函数中定义一个lambda选择器函数,该函数将在执行时进行求值。唯一需要注意的是,该字段/属性必须是公开可见的,以供外部读取。这个简单的类应该可以完成您想做的事情。我确实注意到linq.Average()的默认返回类型是double而不是float。因此,我已对此进行了更改,但否则应该足够了。
public class QueueT<T>
{
public QueueT(Func<T, int> avgSelector)
{
selector = avgSelector;
}
private Func<T, int> selector;
private object syncLock = new object();
private Queue<T> queue = new Queue<T>();
public double Average()
{
lock (syncLock)
{
return (from item in queue select selector(item)).Average();
}
}
}
样本类型
public class Car
{
//
public int HP => 500;
}
然后,当您创建实例时
public class RealImplementationandUseClass
{
public RealImplementationandUseClass()
{
var q = new QueueT<Car>((c) => c.HP);
}
}
这样,您可以保证在编译时该类型可以使用选择器,而不必在队列类的通用类型上施加约束。
TA贡献1831条经验 获得超10个赞
好吧,从源头上看,您可以用这种方式实现该方法:
public double Average()
{
return (from item in CopyToArray() select MakeNumberOrThrow(item)).Average();
}
private int MakeNumberOrThrow(object mightBeANumber)
{
return (int) mightBeANumber;
}
正如@Evk在注释中提到的,为了使用LINQ Average(),类型必须是数字。没有一种方法可以将通用类型限制为C#中的数字,因此您必须以某种方式将类型转换为数字。显然,此方法或任何其他方法对自定义队列包装器中可能存在的所有类型都不安全。
- 2 回答
- 0 关注
- 117 浏览
添加回答
举报