2009-09-15 45 views
2

考虑有许多产品的生产计划应用程序。每个产品都有一个在InventoryControlType上键入的InventoryControl对象列表。根据我们为生产计划运行的算法,我们需要访问给定产品的不同类型的InventoryControl对象。这工作正常。然而,今天我需要在InventoryControl中引入一个包含InventoryControlType的字段,因为我们深入了解我们需要了解InventoryControlType的算法。在此生产计划示例中,使用字典<enum,object>正确吗?

但是,我感觉我觉得我做错了什么,因为它看起来像我重复数据。

这个设计对你来说好吗?任何改进想法?

class Product{ 
    Dictionary<InventoryControlType, InventoryControl> InventoryControls; 
    GetInventoryControl(InventoryControlType type){ 
     return InventoryControls[type]; 
    } 
} 

class InventoryControl{ 
    InventoryControlType controlType; 
    float limit; 
    float cost; 
    ... 
    CalculateCost(){...} 
    GetConstraint(){...} 
} 

回答

6

我觉得你很好。至少以我的经验来说,使用对象的唯一属性作为关键是非常正常的 - 无论是在DictionaryDataTable还是你自己。

例如,在我自己的工作我们主要的项目有所谓的Product有一个名为Symbol财产类和应用程序维护一个名为DictionaryProducts每个Product对象的Symbol财产作为其关键。

想想这样:如果你有一个带有两个表的数据库,并且一个表通过键引用另一个表的行,那么你可能觉得你是“复制”数据,因为你有相同的数字关键)在两个地方。但这不是重复;这是一个参考。在你的情况下也是如此。

2

我没有看到任何内在的错误。它正在复制一条信息,但情况确实需要它。您可以使用普通集合而不是字典 - 但是因为您的主要目标是根据其InventoryControlType,Dictionary以及此实现找到一条信息似乎是最正确的。

2

我认为这对于Dictionary<TKey, TValue>用例来说绝对没问题。

很多时候Dictionary对象总是会有一些来自value对象的冗余信息,其中最常见的就是一个ID, Dictionary<int, SomeObject>其中int将取自SomeObject.Id的值 - 在这方面它是有意义的,它与您的用例完全相同。

2

这实际上取决于字典应该得到多大,因为对于非常大量的数据,我认为使用该键的字典查找可能会更快。但是,如果你没有大量的数据,你可以使用Linq和通用列表。例如:

class Product{ 
List<InventoryControl> InventoryControls; 
GetInventoryControl(InventoryControlType type){ 
    return InventoryControls.First(x => x.ControlType == type); 
} 

我会建议运行一些单元测试基准来查看字典是否是必需的。