0

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

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

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

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

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

4

4 回答 4

2

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

在以太情况下,您可能还需要某种关于对象的元数据。即属性名称到{类型、限制、验证规则、其他}的映射。

于 2012-09-16T19:02:44.493 回答
2

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

首先,“你不能在里面倾倒任何东西object[]”。错误的!你可以倾倒任何东西,object[]因为一切都是对象。你必须只能将它转换回你需要的任何东西。

二是“慢”。又造假了!只要您知道在哪里查找,普通的旧数组是访问速度最快的集合。访问数组中的特定元素需要 O(1)。

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

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

编辑:这是一个例子

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

    }
}
于 2012-09-16T19:15:53.080 回答
1

在 .NET 中,您在哪里遇到过对象数组失败?

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

对象成员

据我所知,所有的收藏支持对象。

    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();
于 2012-09-16T19:31:40.220 回答
1

可能有几种方法可以到达这里。

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

如何在 C# 中动态创建一个类?

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

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

于 2012-09-16T21:18:39.160 回答