我正在做一些stats工作,想要重构以下方法:
public static blah(float[] array)
{
//Do something over array, sum it for example.
}
但是,我不想使用float []而是使用某种索引可枚举(例如,对于非常大的数组,使用从磁盘动态加载)。 我创建了一个简单的界面,并希望使用它。
public interface IArray<T> : IEnumerable<T>
{
T this[int j] { get; set; }
int Length { get; }
}
我的问题是:
Add
,RemoveAt
,尽管它们是固定大小的欢迎任何帮助。 干杯
答案 0 :(得分:2)
float []只继承IList,而不是IArray,而AFAIK则无法改变它。
T的数组也实现了IList<T>
和其他(但是这些并不总是在工具中显示,数组的几个方面由运行时特别包含)。
我想抛弃IArray并且只使用IList,但是我的类需要实现许多方法[...]
这是事实,但是这样的实现很快就会完成(如果你只需要非修改操作,你可以从修改方法中抛出NotImplementedException
。)
在实践中只需几分钟即可完成,您的实施应该是可重复使用的。还有像ReadOnlyCollection<T>
这样的类型可以帮助避免大量的工作。
然后我的问题:float []如何实现IList,而它没有这些方法?
类型可以显式实现接口方法。它们不是该类型的直接成员,但是转换为接口(或反射)将允许访问。这允许类型化集合实现IEnumerator.Current
(返回Object
),同时还提供返回正确类型的Current
属性。
答案 1 :(得分:1)
事实上,float[] array
确实实现了IList<float>
:
var floats = new[] { 1.0f, 2.0f, 3.5f };
var list = (IList<float>)floats;
这是19.6:
一维数组
S[]
实现接口System.Collections.Generic.IList<S>
(简称IList<S>
)及其基接口。因此,存在从S[]
到IList<S>
及其基接口的隐式转换。
答案 2 :(得分:0)
我最后写了以下内容: 公共类IArrayWrapper:IArray { private float [] innerArray;
public IArrayWrapper(float[] array)
{
innerArray = array;
}
public static implicit operator float[](IArrayWrapper wrapper)
{
return wrapper.innerArray;
}
public static implicit operator IArrayWrapper(float[] array)
{
return new IArrayWrapper(array);
}
public IEnumerator<float> GetEnumerator()
{
return ((IEnumerable<float>) innerArray).GetEnumerator();
}
IEnumerator IEnumerable.GetEnumerator()
{
return innerArray.GetEnumerator();
}
public float this[int j]
{
get { return innerArray[j]; }
set { innerArray[j] = value; }
}
public int Length
{
get { return innerArray.Length; }
}
}
我并不为此感到自豪,但我认为隐含的操作员应该解决我的问题......希望如此。