【问题标题】:Data structure to define a "flexible table" in C# 2.0?在 C# 2.0 中定义“灵活表”的数据结构?
【发布时间】:2013-03-16 12:17:01
【问题描述】:

我正在尝试在 C# 2.0 中实现一个可以像这样表示的数据结构:

  | field1 | field2 | field3 | ... (variable length) ...
  +--------+--------+--------+-------------------
1 | int0   | float0 | bool0  | ...
2 | int1   | float1 | bool1  | ...
. |
. |
. |
(variable) ...

目前,我正在考虑一些非常基本的事情:

public class DataStructure {
    string name;
    List<string> fieldNames;
    List<Item> items;
}

public class Item {
    List<object> values;
}

然后,您可以使用隐式定义要检索的类型的方法(即bool GetBool (string field)int GetInteger (string field))进行访问,因此您可以使用一小组内置类型和自定义类(例如CustomBaseObject) .

是否有任何现有的数据结构实现可以做到这一点? 这是解决我在这里提出的问题的另一种(更好)方法吗? (考虑到访问和修改操作的复杂性)

另外,我不知道对List&lt;object&gt; values 进行装箱/拆箱的最佳方法是什么,除了像(type)values[index] 那样投射它。

【问题讨论】:

  • 使用老式的 System.Data.DataTable 怎么样?
  • 看起来不错!但是,我看到 Unity3D (Mono 2.10.2) 似乎没有可用的命名空间 System.Data,所以我无权访问 DataTable :(

标签: c# data-structures dictionary hashtable c#-2.0


【解决方案1】:

在 C# 4.0 中,您可以使用 ExpandoObject 获得这些结构的体面实现,使用 dynamic 关键字为您提供更好的开发体验。请参阅:http://msdn.microsoft.com/en-us/magazine/ff796227.aspx 以获得良好的介绍。

在 C# 2.0 中,您可以通过实现 IExpando 的对象获得类似的行为。详情请见What is IExpando and where is it used?

如果您选择不走那条路,那么您可能希望将内部实现从两个列表切换到 IDictionary&lt;String, Object&gt;,因为它更容易实现,并且在性能方面迅速超过双列表实现,因为字段是已添加。

【讨论】:

  • 那是 C# 4.0。在 C# 2.0 上无法做到这一点。
  • 太棒了。关于IExpando,我来看看。我没有使用Dictionary,因为我使用的是Unity3D,它无法序列化DictionaryHashtable 之类的结构(也没有找到方法),但它适用于List。我需要通过它们的内部实现对所有这些数据进行序列化。如果我使用IDictionary 并在内部处理Lists,我是否能够序列化我的DataStructure 类?
  • 你应该能够序列化字典的内容,即使你需要自己做。我不太确定 Unity3D 是如何进行序列化的,但如果它们依赖于 .Net 序列化,您应该能够实现 ISerializable 并在 GetObjectData 方法中处理字典值的存储。如果他们以其他方式进行序列化,应该有允许你这样做的钩子,而且应该很简单,因为它只是一组键/值对。
  • 我认为他们使用自定义实现(有关此主题的更多信息:blogs.unity3d.com/2012/10/25/unity-serialization)。你说的钩子是什么意思? “找到他们”的任何提示?我正在摆弄ISerializable 以及为我的具体情况正确编写GetObjectDataSaveData 的方法,但找不到让它工作的方法。
  • 钩子是指一种比使用属性更直接地控制序列化的方法。我不确定这是否可行,answers.unity3d.com/questions/19047/… 表示它可能不是,但 Unity3 可能已经解决了它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-03-04
  • 2017-08-13
  • 1970-01-01
  • 2010-10-10
  • 2013-11-13
  • 2011-06-03
  • 1970-01-01
相关资源
最近更新 更多