一个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.EventDate作为键。它工作正常的域,但我想知道如果事实,关键是已经部分的价值本身不是一个“臭”。

我也没有理由要坚持什么,但字典中的值。因为我使用NHibernate,我可能需要编写一些自定义类型做到这一点,我想知道如果这也是我应该使用不同类型的集合的线索。 (这也是在配置类别的虚拟性质的原因)。

我想的主要替代方案是具有专用EqualityComparer一个HashSet。

你怎么认为呢?

干杯, Berryl

有帮助吗?

解决方案

如果您使用外部比较器做一个HashSet<Allocation>,你必须非常小心,不要更改日期而无需重新输入字典中的价值。你有这样的问题,无论哪种方式,但它是由可变性恶化(至少Dictionary<,>它仍然能够跟踪自己的键和值)。随着可变值,否则可能永远不会再看到价值的关键组成部分...

当我如期系统曾在我实际使用SortedList<,>这个过去 - 相似,但有用的,如果你一般要在序列数据,并允许如果数据是相当一致的二进制搜索

其他提示

我不认为这样的事实,关键是部分的价值必然是一个问题。在我的经验,这是相当频繁的字典的情况。用适当的相等比较一个HashSet肯定会的工作,只要你永远需要得到在与特定EventDate当前对象。这似乎是一个有用的东西是能够做到的,可能...

您目前只是关注一个有些模糊的方式,或者你有一个具体的怀疑,如何这可能会咬你?

使用标准库,没有更好的解决方案,我知道的。不过,我也感受到了这种代码是一个“臭”,但它是因为集合类的BCL,而不是你的代码。

我不知道为什么MS没有创建通用Sets<TKey, TData> where TData: IKeyed<TKey>左右,而不是字典,因为这将允许实现这样的数据结构,其中的关键是数据的一部分。所述KeyValuePair<TKey, TValue>: IKeyed<TKey>也只是一个辅助结构实现此接口并因此允许创建,因为我们现在有它相同词典功能。

另外(继续与小咆哮),我不知道他们为什么不加入声明不变类型的概念,使之成为可能的泛型类型约束,因为这将允许以确保运行过程中的关键不改变其哈希码(可如果一个在一些可变对象实现GetHashCode()Equals()目前发生)。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top