Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 针对任意数据的优化数据结构_C#_.net_Generics_Data Structures - Fatal编程技术网

C# 针对任意数据的优化数据结构

C# 针对任意数据的优化数据结构,c#,.net,generics,data-structures,C#,.net,Generics,Data Structures,我需要以类似于数据集的方式存储数据,即您应该能够按编号访问项/行,然后按字段名访问该项的不同字段 然而,让我夜不能寐的是,从记忆/铸造/性能的角度来看,这样的结构可以优化多少。有些人可能会认为这是一个不必要的微优化,但请容忍我,将其视为一个练习:)(不,这不是家庭作业) 我想为每个项目分配尽可能少的内存,这意味着最好不要空字段和尽可能少的实例 我希望尽可能避免强制转换,最好使用泛型 我希望能够以一种良好的、类型安全的方式访问字段,即items[0].Field(“fieldname”)或ite

我需要以类似于数据集的方式存储数据,即您应该能够按编号访问项/行,然后按字段名访问该项的不同字段

然而,让我夜不能寐的是,从记忆/铸造/性能的角度来看,这样的结构可以优化多少。有些人可能会认为这是一个不必要的微优化,但请容忍我,将其视为一个练习:)(不,这不是家庭作业)

  • 我想为每个项目分配尽可能少的内存,这意味着最好不要空字段和尽可能少的实例

  • 我希望尽可能避免强制转换,最好使用泛型

  • 我希望能够以一种良好的、类型安全的方式访问字段,即items[0].Field(“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];
    }
}
公共类项:IEnumerable
{
私有列表项=新列表();
公共项目[整数索引]
{
得到
{
返回此.items[索引];
}
}
公共IEnumerator GetEnumerator()
{
返回此.items.GetEnumerator();
}
}
公共类项目
{
私有字典字段=新字典(StringComparison.OrdinalIgnoreCase);
公共T字段(字符串字段名)
{
返回(T)这个.fields[fieldName];
}
}
你能:

a) 使用泛型做一些类似的事情(或者以其他方式避免强制转换)?不存储其他字段,即不为每个类型和字段存储一个变量

b) 拥有items类,但不需要使用items实例,而是直接在items中使用列表,并且仍然能够枚举该类并使用Field方法访问其数据。我想扩展方法是唯一的出路

一个想法是使用带有flyweight的产量枚举器来避免项目实例,但我很快意识到,如果通过PLINQ之类的东西并行访问项目,可能会出现潜在的问题(或者我弄错了)


c) 使用完全不同的方法?

除非您为每个可能存储的项目类型创建单独的类或成员,否则我看不出您将如何进行转换


当然,每种可能的类型都有一个成员会给您带来内存开销,因为每个项目都有重量(它不是一种类型的所有成员)。就封装外形而言,使用字符串/对象字典和泛型方法将所需对象强制转换为其真实类型,您的想法是正确的。

除非您为可以存储的每个可能的项目类型创建单独的类或成员,否则我看不出您将如何避免强制转换


当然,每种可能的类型都有一个成员会给您带来内存开销,因为每个项目都有重量(它不是一种类型的所有成员)。就示意图而言,您对字符串/对象字典和将所需对象转换为其真实类型的通用方法的想法是正确的。

您对性能有什么要求吗?读/写O(1)/O(日志n)/O(n)?你有任何表演愿望吗?读/写O(1)/O(日志n)/O(n)?