我需要以类似于数据集的方式存储数据,即您应该能够按编号访问项目/行,然后按字段名称访问该项目的不同字段。
然而,让我上夜的是这样的结构可以从内存/演员/性能的角度来优化多少。有些人可能会认为这是一个不必要的微优化,但请耐心等待,将其视为练习:)(不,不是作业)
我想为每个项目分配尽可能少的内存,这意味着最好甚至不是空字段和尽可能少的实例
我想尽量避免使用,尤其是使用泛型
我希望能够以一种漂亮的,类型安全的方式访问字段,即items [0] .Field< int>(“fieldname”)或items [0] .Field.Int(“fieldname” “)(似乎不太优雅)
我需要能够按索引访问项目,并且需要是IEnumerable
需要支持并发阅读/枚举
如果我们从这个(简化示例)结构开始:
public class Items : IEnumerable<Item>
{
private List<Item> items = new List<Item>();
public Item this[int index]
{
get
{
return this.items[index];
}
}
public IEnumerator<Item> GetEnumerator()
{
return this.items.GetEnumerator();
}
}
public class Item
{
private Dictionary<string, object> fields = new Dictionary<string, object> (StringComparison.OrdinalIgnoreCase);
public T Field<T>(string fieldName)
{
return (T)this.fields[fieldName];
}
}
你可以:
a)用仿制药(或其他避免铸造的方式)做类似的事情?不存储其他字段,即不为每个类型和字段存储一个变量
b)拥有items类但不需要Item实例,而是直接在Items中使用List,并且仍然可以使用Field方法枚举类并访问它的数据。我想扩展方法不知何故是唯一的方法。
一个想法是让一个带有flyweight的yield枚举器来避免Item实例,但我很快就意识到如果通过像PLINQ这样的东西并行访问项目的潜在问题(或者我错了)
c)使用一些完全不同的方法?答案 0 :(得分:1)
除非你为创建一个可以存储的每个可能的项目类型的单独的类或成员,否则我不知道你将如何绕过投射。
当然,拥有每种可能类型的成员会给你带来内存开销,因为每个项目都带有重量(所有成员不是一种类型)。足迹方面,你有一个正确的想法,一个字符串/对象字典和一个通用的方法将所需的对象强制转换为它的真实类型。