在内存中存储MySQL或JSON数据的有效方法?

时间:2012-09-16 18:56:40

标签: c# .net memory types formats

在Javascript,AS3和Python等平台中,默认情况下支持和推荐无类型数据数组,数组通常是在内存中存储任意用户数据的最简单,最有效的方法。 (表格数据,CSV数据,JSON数据等)

然而,.NET喜欢强类型格式的所有内容;你只是不能将任何内容转储到List<object>数组中,虽然它可以工作,但处理起来会更慢,更笨拙(类型检查,每次使用都会输入类型)。因此,通常最终将数据模式定义为类,其属性对应于列,并将数据存储在该类的实例中。

那么在内存中存储任意数据的推荐方法是什么,尤其是当模式不断升级(例如CSV或JSON)时,您无法在开发时“硬编码”。

编辑:此类数据可能包括数字(整数/浮点数),字符串,日期,时间,单位,地理空间数据,几何数据,嵌入文件,基本上是MySQL数据库或JSON文件可以存储的所有内容

编辑:在内存中,这些数据可用于各种处理;生成图表的计算,通过子串搜索数据的字符串处理,地理空间/ 3D数据的数字运算算法等,验证脏数据和优化冗余数据的优化算法等。

4 个答案:

答案 0 :(得分:2)

使用Dictionary<string,object>或考虑(4.0+)使用动态对象存储单个项目的一种可能方法。然后再将项目放入List或Array或Dictionary。

在以太网情况下,您还可能需要某种关于对象的元数据。即属性名称为{type,restrictions,validation rules,whatever else} mapping。

答案 1 :(得分:2)

我不同意问题中的一些陈述。

首先,“你不能在object[]”中转储任何内容。假!您可以在object[]中转储任何内容,因为所有内容都是对象。你必须只能把它扔回你需要的任何东西。

其次,“它更慢”。又错了!只要知道要查看的位置,普通旧数组就是最快的访问集合。它需要O(1)来访问数组中的特定元素。

如果您需要在C#类中存储CSV,您可以考虑System.Data.DataTable,但最通用的是object[],其中每个元素本身可以是另一个object[]到达你想要的深度水平。

如果您确实需要随机访问,则必须按照Alexei所述的Dictionary<string,object>进行

编辑:这是一个例子

void ScanCollection(object[] collection)
{
    foreach (object item: collection)
    {
        if (item is string)
        ///Treat as string
        else if (item is float)
        ///Treat as float
        else if (item is SomethingElse)
        ///Treat as SomethingElse class

    }
}

答案 2 :(得分:1)

.NET中有哪些对象失败?

由于一个对象只支持5种方法,因此没有多少肉。

Object Members

据我所知,所有集合支持对象。

    List<Object> lObjs = new List<object>();
    HashSet<Object> hObjs = new HashSet<object>();
    Dictionary<int, Object> dObjs = new Dictionary<int, object>();
    Object[] aObjs = new Object[10];

    aObjs[0] = "string";
    aObjs[1] = 1d;
    aObjs[2] = new object();

答案 3 :(得分:1)

这里可能有几种方法。

您可以通过反射以编程方式创建类。

How to dynamically create a class in C#?

然后使用泛型集合和一些LINQ to Objects来查询数据。

或者,您可以从任何数据源动态使用或创建自己的数据源或数据表,并根据您的逻辑使其成为您喜欢的类型,如果它是数据库,您可以检查数据表的列类型。然后,您可以使用datatable对象的select方法查询数据表。