c# - C#动态指定类型

标签 c# csv casting

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

  • 我希望用户指定他们想要存储的数据类型。
  • 我想减少类型转换,因为我认为这会非常昂贵。
  • 我会在我的申请中非常频繁地使用这些数据。

我不知道DataSet中会存储什么类型的数据,所以我最初的想法是让它成为一个List。的 object s,但我怀疑数据的频繁使用和类型转换的需要会非常昂贵。

基本思路是这样的:

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 获得的数据第一列包含标签的文件。当从 CSV 加载数据时文件我想指定类型而不是转换为 object .数据可能包含日期、数字、字符串等列。它可能如下所示:

"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> (如果它是 DateTime 列)或 List<double> (如果它是一列 double )。

有什么方法可以实现吗?可能我的做法不对,有没有更好的办法解决这个问题?

最佳答案

我建议您试试您现在拥有的。也许性能会足够好。如果没有,只有到那时,您才能考虑进一步优化。

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

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

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

关于c# - C#动态指定类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2466278/

相关文章:

C# 从 IP 地址字符串中删除尾随 '\0'

csv - SAS Proc 导入和格式错误

mysql - 用于导出的 INTO OUTFILE 查询在本地驱动器上不起作用

c++ - 您如何合法地对舍入 double 执行 mod 运算符?

sql - PostgreSQL 将数组转换为二维

c# - 带有 UDPClient.EndReceive 和 ref 远程端点参数的 Observable.FromAsyncPattern

c# - 在排序的链表之后/之前插入 Big O 复杂性

c# - Request.Cookies 为空

R:使用 read.csv() 尊重数字周围的引号(视为字符)?

C++ 将 int 转换为 double