如何创建泛型类型字典的基类以将其存储在列表中?

时间:2014-11-22 13:49:53

标签: c# .net oop generics dictionary

我有很多方法可以返回数据集列表,这些数据集表示为键(DateTime)和值(某些ValueTypestring,我不知道它)对,这个数据集可能有大约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); }字典的新实例,而我无法修改原始列表。

那么请帮助我如何创建泛型类型字典的基类以将其存储在列表中?

我将非常感谢任何帮助!我知道设计(或编码)有错误,如果有人帮我找到它,我会很高兴的!甚至可以解决这个问题吗?

1 个答案:

答案 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);