自定义固定大小Queue无法调用Average方法的技术咨询
我来帮你拆解这个问题哈!首先,LINQ的Average方法是给实现了IEnumerable<T>接口的集合设计的扩展方法,你自己写的固定大小Queue大概率没正确实现这个泛型接口,或是只实现了非泛型的IEnumerable——这就导致LINQ没法识别集合里元素的具体类型,自然找不到匹配的Average重载。
至于你说的queue.ToArray().Average()也失效,大概率是你的ToArray()方法返回的是object[]类型,而非你实际存储的数值类型数组(比如int[]、double[])。LINQ没法直接对object[]调用Average,除非你先把元素强转成数值类型。
具体解决步骤:
让自定义Queue实现泛型
IEnumerable<T>接口
你需要在自定义Queue的类定义里加上IEnumerable<T>,然后实现泛型和非泛版的GetEnumerator()方法(非泛型版本可以直接调用泛型的)。示例代码如下:public class FixedSizeQueue<T> : IEnumerable<T> { private readonly Queue<T> _innerQueue; private readonly int _maxSize; public FixedSizeQueue(int maxSize) { _maxSize = maxSize; _innerQueue = new Queue<T>(maxSize); } public void Enqueue(T item) { if (_innerQueue.Count >= _maxSize) { _innerQueue.Dequeue(); } _innerQueue.Enqueue(item); } // 实现泛型IEnumerable<T>的GetEnumerator public IEnumerator<T> GetEnumerator() { return _innerQueue.GetEnumerator(); } // 实现非泛型IEnumerable的GetEnumerator(必须实现) IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator(); } // 修正ToArray方法,返回强类型数组 public T[] ToArray() { return _innerQueue.ToArray(); } }确保Queue存储的是数值类型
Average方法仅支持数值类型(int、double、decimal等)。如果你的Queue存的是自定义类,那得用Average(x => x.NumericProperty)这种重载,明确指定要计算平均值的属性。现在就能正常调用Average了
示例调用代码:var queue = new FixedSizeQueue<double>(5); queue.Enqueue(1.0); queue.Enqueue(2.0); queue.Enqueue(3.0); double avg = queue.Average(); // 正常工作 // 转数组调用也没问题 double avgFromArray = queue.ToArray().Average();
额外说明:
如果你之前的自定义Queue是基于非泛型的System.Collections.Queue,那所有元素都是object类型,这时候不管直接调用Average还是转数组,都需要先把元素强转成数值类型,比如:
// 非泛型Queue的处理方式 double avg = queue.Cast<double>().Average(); // 转数组后强转 double avgFromArray = ((object[])queue.ToArray()).Cast<double>().Average();
不过这种方式不如泛型版本优雅,建议优先使用实现了泛型IEnumerable<T>的自定义Queue。
内容的提问来源于stack exchange,提问作者Roald

