代码之家  ›  专栏  ›  技术社区  ›  Kiril

在C中动态指定类型#

  •  1
  • Kiril  · 技术社区  · 14 年前

    我正在创建一个自定义数据集,我受到了一些限制:

    • 我希望用户指定要存储的数据类型。
    • 我想减少类型铸造,因为我认为它将非常昂贵。
    • 我将在应用程序中经常使用这些数据。

    我不知道数据集中会存储什么类型的数据,所以我最初的想法是将其作为 List 属于 object 但是我怀疑频繁使用数据和需要类型转换会非常昂贵。

    基本理念是:

    class DataSet : IDataSet
    {
        private Dictionary<string, List<Object>> _data;
    
        /// <summary>
        /// Constructs the data set given the user-specified labels.
        /// </summary>
        /// <param name="labels">
        /// The labels of each column in the data set.
        /// </param>
        public DataSet(List<string> labels)
        {
            _data = new Dictionary<string, List<object>>();
            foreach (string label in labels)
            {
                _data.Add(label, new List<object>());
            }
        }
    
        #region IDataSet Members
    
        public List<string> DataLabels
        {
            get { return _data.Keys.ToList(); }
        }
    
        public int Count
        {
            get { _data[_data.Keys[0]].Count; }
        }
    
        public List<object> GetValues(string label)
        {
            return _data[label];
        }
    
        public object GetValue(string label, int index)
        {
            return _data[label][index];
        }
    
        public void InsertValue(string label, object value)
        {
            _data[label].Insert(0, value);
        }
    
        public void AddValue(string label, object value)
        {
            _data[label].Add(value);
        }
    
        #endregion
    }
    

    一个具体的例子 DataSet 将用于存储从 CSV 文件,其中第一列包含标签。当数据从 猪瘟病毒 我要指定类型而不是强制转换到的文件 对象 . 数据可以包含日期、数字、字符串等列。以下是数据的外观:

    "Date","Song","Rating","AvgRating","User"
    "02/03/2010","Code Monkey",4.6,4.1,"joe"
    "05/27/2009","Code Monkey",1.2,4.5,"jill"
    

    这些数据将用于机器学习/人工智能算法,因此我必须使数据的读取速度非常快。我想尽可能地消除类型转换,因为我负担不起每次读取时从“对象”转换到所需的任何数据类型。

    我见过允许用户为csv文件中的每个项目选择特定数据类型的应用程序,因此我正在尝试制定一个类似的解决方案,可以为每个列指定不同的类型。我想创建一个通用解决方案,这样就不必返回 List<object> 但一 List<DateTime> (如果是日期时间列)或 List<double> (如果是双打的话)。

    有什么办法可以做到这一点吗?也许我的方法不对,有没有更好的方法来解决这个问题?

    2 回复  |  直到 14 年前
        1
  •  2
  •   jjxtra    14 年前

    我建议你现在就试试。也许表演会足够好。如果没有,只有在那时,你才能考虑进一步优化。

    您还可以将每个字段存储为这样的变量对象:

    struct Variant
    {
       string StringValue;
       DateTime DateTimeValue;
       bool BoolValue;
       // ... etc. ...
    }
    

    然后您只需要从结构访问适当的成员,但这可能会增加内存使用和if语句的开销…

        2
  •  2
  •   flq    14 年前

    请记住,数据集还将行、列等存储为对象。使它们类型安全通常意味着在类型化的数据集中,强制转换已经完成。

    我认为这真的取决于从csv中读取的数据会发生什么,但是为了在不预先知道需要哪些类型的情况下消除强制转换,我只能考虑创建通过reflection.emit动态保存数据的类型。

    不过,正如杰夫所说,演员阵容可能不会扼杀你的应用程序。