我有很多方法可以返回数据集列表,这些数据集表示为键(DateTime
)和值(某些ValueType
或string
,我不知道它)对,这个数据集可能有大约10000个项目和更多的大小。例如:
public List<DataSet> GetAnyData(...)
{
var resultList = new List<DataSet>(); // Create the list for the base class
resultList.Add(new DoubleDataSet()); // This classes will be filled in this method
resultList.Add(new StringDataSet()); // See the description for them below
return resultList;
}
此方法的结果列表示例:
ListItem1 ListItem2
Date1 Values1 Date2 Values2
01:00 10.5 02:00 "a"
01:15 20.42 02:15 "b"
01:30 30.01 02:30 "c"
收到这些数据集后,我需要以不同的方式处理它们(使用LINQ)。我的问题是:如何创建DataSet类?
我尝试了很多解决方案:
1)使用泛型类型从Dictionary继承DataSet类:
abstract class DataSet<T> : Dictionary<DateTime, T> {...}
并创建特定的类:
class DoubleDataSet : DataSet<double> {...}
class StringDataSet : DataSet<string> {...}
但问题是:如何创建我可以存储在数据集列表中的基类?
2)创建DataItem
的{{1}}的类,并在第一个解决方案中使用它:
DataSet
但问题是:如何知道我需要采用class DataItem
{
public double DoubleValue { get; set; }
public string StringValue { get; set; }
// etc
}
class DataSet : Dictionary<DateTime, DataItem> {...}
的属性?
3)将数据存储在DataItem
类:
object
但问题是:拳击和拆箱怎么办?如果我有50 000个值并且每个值都将转换为对象并返回到所需类型,那么它将花费大量时间。同样使用LINQ,public class DataSet : Dictionary<DateTime, object> {...}
public class DoubleDataSet : DataSet
{
public new double this[DateTime key]
{
get { return base[key] as double; }
set { base[key] = value; }
}
}
值的类型将是DataSet
,我将需要知道它是什么类型。
4)将数据存储在object
类:
DataSet
但问题是:public class DataSet
{
public Dictionary<DateTime, DataItem> Items {get; set;}
}
public class DoubleDataSet : DataSet
{
public new Dictionary<DateTime, double> Items
{
get { return base.Items // It wouldn't work because there a new dictionary is created
.ToDictionary(q => q.Key, q => q.Value.DoubleValue); }
set { base.Items = value
.ToDictionary(q => q.Key, q => new DataItem(q.Value, null)); }
}
}
会返回get { return base.Items.ToDictionary(q => q.Key, q => q.Value.DoubleValue); }
字典的新实例,而我无法修改原始列表。
那么请帮助我如何创建泛型类型字典的基类以将其存储在列表中?
我将非常感谢任何帮助!我知道设计(或编码)有错误,如果有人帮我找到它,我会很高兴的!甚至可以解决这个问题吗?
答案 0 :(得分:2)
如果我理解正确,您需要在列表中存储和处理不同类型的对象,但在处理时,您不知道您正在使用哪种类型的对象。
您可以尝试一件事:由于您的DataItem
类知道它是什么类型,为什么不让它决定如何通过实现visitor模式来处理它?</ p>
要实现此目的,您必须执行以下操作: 首先,实现不同的数据项:
// base class you can use in dictionaries
// note that is does not store any data type
class DataItem
{
// method called from outside
// for processing the item
public abstract void GetProcessed(Processor p);
}
// DataItem which stores a double
class DoubleDataItem : DataItem
{
public double Data{get;set;}
public override void GetProcessed(Processor p)
{
p.Process(this);
}
}
// DataItem which stores a string
class StringDataItem : DataItem
{
public string Data {get;set}
public override void GetProcessed(Processor p)
{
p.Process(this);
}
}
现在,使用哪种数据的信息只存储在相关的类中。每个类还可以检索处理器(或访问者)。然后,此处理器/访问者可以根据其运行的类型具有不同的实现:
public class Processor
{
// do processing for double items
public void Process(DoubleDataItem d);
// do processing for string items
public void Process(StringDataItem d);
}
现在,当您创建字典时,处理器将根据其运行的项目执行正确的代码:
var dictionary = new Dictionary<DateTime,DataItem>();
// fill dictionary with data item
var processor = new DoSomethingProcessor();
foreach (var entry in dictionary)
entry.Value.GetProcessed(processor);