【发布时间】:2010-11-06 10:12:09
【问题描述】:
TimeSheetActivity 类有一个分配集合。分配是一个值对象,也被域中的其他对象使用,看起来像这样:
public class Allocation : ValueObject
{
public virtual StaffMember StaffMember { get; private set; }
public virtual TimeSheetActivity Activity { get; private set; }
public virtual DateTime EventDate { get ... }
public virtual TimeQuantity TimeSpent { get ... }
}
不允许对同一个 Allocation.EventDate 进行重复分配。因此,当客户端尝试对活动进行分配时,会检查集合中是否已经存在同一个 Allocation.EventDate 的 Allocation。如果不是,则将新的 Allocation 添加到集合中,但如果是,则将现有的 Allocation 替换为新的。
我目前正在使用字典来维护集合,并以 Allocation.EventDate 作为键。它适用于域,但我想知道密钥已经是值的一部分这一事实本身是否不是“难闻的气味”。
除了字典值之外,我也没有理由保留任何内容。因为我使用的是 NHibernate,所以我可能需要编写一些自定义类型来做到这一点,我想知道这是否也是我应该使用不同类型的集合的线索。 (这也是 Allocation 类中的虚拟属性的原因)。
我正在考虑的主要替代方案是带有专用 EqualityComparer 的 HashSet。
你怎么看?
干杯, 浆果
【问题讨论】:
-
我知道这是一个非常古老的问题。但我想知道为什么没有人建议使用链表,毕竟这是字典内部用于冲突哈希的内容。
Dictionary<TKey, TValue>不能有重复键的唯一原因是当你查找一个时它不知道返回什么。 (顺便说一句,将链接类型设为结构,可以节省很多性能。)
标签: c# collections dictionary nhibernate-mapping hashset