【问题标题】:Dynamically specify the type in C#在 C# 中动态指定类型
【发布时间】:2010-03-17 22:12:05
【问题描述】:

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

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

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

基本思路是这样的:

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&lt;object&gt;,而是返回 List&lt;DateTime&gt;(如果它是 DateTime 列)或 List&lt;double&gt;(如果它是双精度列)。

有什么方法可以实现吗?也许我的方法是错误的,有没有更好的方法来解决这个问题?

【问题讨论】:

  • 您期望 CSV 文件有多少种变体?
  • 您为什么认为类型转换会成为瓶颈?你做过测试吗?
  • @Jeff 我不知道我会有多少 CSV 文件的变体...我希望程序能够处理出现的任何 CSV 文件和格式。
  • @mmyers 我不认为类型转换会成为瓶颈,但我正在构建的框架花费大约 90% 的时间来读取数据,有时还会调用对数据进行计算的函数(计算函数使用记忆来减少函数调用)。我怀疑我会看到类型转换的性能下降,虽然我还没有做过任何测试(现在会做)。
  • @Lirik:你还没有做任何测试?嘘!你会召唤迈克·邓拉维!

标签: c# csv casting


【解决方案1】:

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

您还可以将每个字段存储为一个变体对象,如下所示:

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

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

【讨论】:

    【解决方案2】:

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

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

    不过,正如 Jeff 所说,强制转换可能不会杀死您的应用。

    【讨论】:

      猜你喜欢
      • 2011-05-07
      • 2021-10-25
      • 2021-06-18
      • 2020-03-19
      • 2015-06-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-14
      相关资源
      最近更新 更多