我正在创建一个自定义数据集,但我受到一些限制:
- 我希望用户指定他们想要存储的数据类型。
- 我想减少类型转换,因为我认为这会非常昂贵。
- 我会在我的申请中非常频繁地使用这些数据。
我不知道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/