为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
ITMISS 2021-05-11 21:54:49
我有一个包装队列的自定义“可锁定”队列类。但是,它缺少平均方法。这是我尝试添加到下面的源链接中列出的Class中的Average方法public float Average()        {            lock (syncLock)            {                return queue.Average();            }        }但在“队列”上得到以下错误队列不包含“ Average”的定义,最佳方法扩展重载“ Enumerable.Average(IEnumerable)”要求接收器的类型为“ IEnumerable”原始来源https://gist.github.com/jaredjenkins/5421892
查看完整描述

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);

    }

}

这样,您可以保证在编译时该类型可以使用选择器,而不必在队列类的通用类型上施加约束。


查看完整回答
反对 回复 2021-05-23
?
慕哥6287543

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#中的数字,因此您必须以某种方式将类型转换为数字。显然,此方法或任何其他方法对自定义队列包装器中可能存在的所有类型都不安全。


查看完整回答
反对 回复 2021-05-23
  • 2 回答
  • 0 关注
  • 117 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信