在自定义队列包装器中实现Average方法

我有一个包装队列的自定义“可锁定”队列类。但是,它缺少平均方法。


这是我尝试添加到下面的源链接中列出的Class中的Average方法


public float Average()

        {

            lock (syncLock)

            {

                return queue.Average();

            }

        }

但在“队列”上得到以下错误


队列不包含“ Average”的定义,最佳方法扩展重载“ Enumerable.Average(IEnumerable)”要求接收器的类型为“ IEnumerable”


原始来源https://gist.github.com/jaredjenkins/5421892


ITMISS
浏览 118回答 2
2回答

扬帆大鱼

由于您显然在类中定义了一些字段或属性,可以对其进行汇总以获得平均值,因此可以选择在构造函数中定义一个lambda选择器函数,该函数将在执行时进行求值。唯一需要注意的是,该字段/属性必须是公开可见的,以供外部读取。这个简单的类应该可以完成您想做的事情。我确实注意到linq.Average()的默认返回类型是double而不是float。因此,我已对此进行了更改,但否则应该足够了。public class QueueT<T>{&nbsp; &nbsp; public QueueT(Func<T, int> avgSelector)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; selector = avgSelector;&nbsp; &nbsp; }&nbsp; &nbsp; private Func<T, int> selector;&nbsp; &nbsp; private object syncLock = new object();&nbsp; &nbsp; private Queue<T> queue = new Queue<T>();&nbsp; &nbsp; public double Average()&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; lock (syncLock)&nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return (from item in queue select selector(item)).Average();&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }}样本类型public class Car{&nbsp; &nbsp;//&nbsp; &nbsp;public int HP => 500;}然后,当您创建实例时public class RealImplementationandUseClass{&nbsp; &nbsp; public RealImplementationandUseClass()&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; var q = new QueueT<Car>((c) => c.HP);&nbsp; &nbsp; }}这样,您可以保证在编译时该类型可以使用选择器,而不必在队列类的通用类型上施加约束。

慕哥6287543

好吧,从源头上看,您可以用这种方式实现该方法:&nbsp; &nbsp; &nbsp; &nbsp; public double Average()&nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return (from item in CopyToArray() select MakeNumberOrThrow(item)).Average();&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; private int MakeNumberOrThrow(object mightBeANumber)&nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return (int) mightBeANumber;&nbsp; &nbsp; &nbsp; &nbsp; }正如@Evk在注释中提到的,为了使用LINQ Average(),类型必须是数字。没有一种方法可以将通用类型限制为C#中的数字,因此您必须以某种方式将类型转换为数字。显然,此方法或任何其他方法对自定义队列包装器中可能存在的所有类型都不安全。
打开App,查看更多内容
随时随地看视频慕课网APP