您可以创建一个包装类提供了一个类似数组的访问器语法:
class ArrayWrapper<T, TField>
{
Func<T, TField> getField;
T[] array;
public ArrayWrapper(T[] array, Func<T, TField> getField)
{
this.array = array;
this.getField = getField;
}
public TField this[int index]
{
get { return this.getField(this.array[index]);}
}
}
然后,用一个简单的helper方法是这样的:
ArrayWrapper<T, TField> Wrap<T, TField>(T[] array, Func<T, TField> getField)
{
return new ArrayWrapper<T, TField>(array, getField);
}
您可以创建这样一个对象:
var data = new
{
time = Wrap(array_of_packet, p => p.time),
field1 = Wrap(array_of_packet, p => p.field1),
field2 = Wrap(array_of_packet, p => p.field2)
};
...它可用于你想要的方式:
Plot(data.time, data.field1);
根据您的具体需求,您可以通过多种方式详细说明:
- 使类实现一个像
IList<TField>
这样的接口,以便Plot()
可以以不知底层类型的方式编写。 (阵列已经实现了IList<TField>
。)
- 如果性能是高优先级,而不是使用一个委托(
Func<,>
),你可以添加where T is struct
到ArrayWrapper
定义,并有ArrayWrapper
采取字节作为其构造函数的参数偏移,并做一些unsafe
魔法可以更快地访问该字段的数据。
我输了!无论如何,它应该是很长的时间,而不是很长的时间[] – Nair
那么,这是一个完全不同的布局。您需要手动逐项复制所有内容。 – Luaan
你真的应该看看创建[不可变结构](http://stackoverflow.com/questions/3751911/why-are-c-sharp-structs-immutable)。 – juharr