您可以創建一個包裝類提供了一個類似數組的訪問器語法:
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