自定义Lockable Queue包装类添加Average方法报错咨询
解决Queue不包含Average方法的问题
你遇到的问题根源很明确:你内部使用的Queue是非泛型的System.Collections.Queue,它只实现了非泛型的IEnumerable接口;而LINQ的Average扩展方法需要的是泛型的IEnumerable<T>(比如IEnumerable<float>、IEnumerable<int>),所以直接调用queue.Average()会报错。
下面给你两种可行的解决方案,根据你的实际场景选择:
方案1:将内部队列替换为泛型Queue<T>
如果你的业务场景允许,把内部的非泛型Queue改成泛型的Queue<float>(或者你实际存储的数值类型,比如int),这样泛型队列天然实现IEnumerable<T>,直接就能用LINQ的Average方法:
// 先把类内部的queue字段改成泛型类型 private Queue<float> queue = new Queue<float>(); public float Average() { lock (syncLock) { // 空队列的话可以加判断,避免抛出异常 if (queue.Count == 0) return 0f; // 或者根据需求抛出自定义异常 return queue.Average(); } }
方案2:保留非泛型Queue,通过Cast转换后计算平均值
如果不能修改内部队列的类型,那需要先把非泛型队列里的元素转换成数值类型,再调用Average。记得先引用System.Linq命名空间:
public float Average() { lock (syncLock) { if (queue.Count == 0) return 0f; // 假设队列里的元素都是float,根据实际存储的类型替换 return queue.Cast<float>().Average(); } }
⚠️ 注意:如果队列里存在无法转换为目标数值类型的元素,Cast<T>会抛出InvalidCastException,所以要确保队列中元素的类型和你Cast的类型一致,或者用OfType<T>过滤出有效元素后再计算平均值。
内容的提问来源于stack exchange,提问作者Bachalo
相关产品推荐
相关产品推荐

