这种在生产计划示例中使用Dictionary <enum,object>的方法是什么?</enum,object>

时间:2009-09-15 04:32:32

标签: c# oop dictionary enums

考虑具有许多产品的生产计划应用程序。每个产品都有一个InventoryControlType上的InventoryControl对象列表。根据我们为生产计划运行的算法,我们需要访问给定产品的不同类型的InventoryControl对象。这很好用。但是,今天我需要在InventoryControl中引入一个包含InventoryControlType的字段,因为我们的算法深入了解InventoryControlType。

但是,我觉得我做错了,因为看起来我正在重复数据。

这个设计看起来不错吗?有任何改进的想法吗?

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

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

4 个答案:

答案 0 :(得分:6)

我觉得你很好。使用对象的唯一属性作为关键字是完全正常的(至少在我的经验中) - 无论是DictionaryDataTable,还是你有什么。

例如,在我自己的工作中,我们的主要项目有一个名为Product的类,其中包含一个名为Symbol的属性,并且应用程序维护一个名为Dictionary的{​​{1}} Products {1}}对象的Product属性作为其关键字。

以这种方式思考:如果你有一个带有两个表的数据库,而一个表通过键引用另一个表中的行,那么你可能觉得你在复制数据是因为你有相同的数字(钥匙)在两个地方。但这不是重复;这是一个参考。这同样适用于您的场景。

答案 1 :(得分:2)

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

答案 2 :(得分:2)

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

很多时候,Dictionary对象总是会从值对象中获得某种冗余信息,其中最常见的是ID,例如Dictionary<int, SomeObject>其中int将是从SomeObject.Id获取的值 - 它在这方面是有意义的,并且它与您的用例完全相同。

答案 3 :(得分:2)

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

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

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