关于IndexOf的过度实现的问题

时间:2008-12-29 09:57:59

标签: c# collections indexof

我在C#中有一个优先级队列实现,我希望将.IndexOf方法添加到。

但是,由于优先级队列并不真正关注值本身的顺序(也就是说,如果我只是抓住所有值,忽略它们的优先级,它们根本不一定有任何顺序),只有它们的优先级,我对优先级队列的泛型类型T没有任何标准,也就是说,我没有指定它们需要有一些内在的顺序,或可比性

因此,当我开始实施.IndexOf(T value)时,我遇到了一个小问题。

我应该采用什么/如何实现这个标准?我最初的想法只是使用EqualityComparer<T>.Default来确定我是否找到了value,但是现在有这么多类似的类型。

例如,这就是我想出的基础,但这看起来有点过分了:

  • public Int32 IndexOf(T value)(内部使用ClassThatImplementsInterface.Default调用其他人之一)
  • public Int32 IndexOf(T value, IComparer<T> comparer)
  • public Int32 IndexOf(T value, IEqualityComparer<T> comparer)
  • public Int32 IndexOf(T value, IEquatable<T> comparer)
  • public Int32 IndexOf(T value, Predicate<T> predicate)

你做什么的?将此标记为主观和维基,因为这更多的是民意调查而不是其他任何内容。

在重新阅读我自己的问题时,我想我可以使用没有比较器的那个,然后添加谓词版本,这样这个类的用户几乎可以调用任何东西。

另请注意,我也可以pq[index]来获取包含优先级和值本身的项目,所以我也可以在没有IndexOf的情况下获得,但我也想拥有表示将值X的优先级更改为优先级P 的方法,这将需要在内部进行某种形式的IndexOf / search。因此,我也希望避免对所有这些方法进行无数次重载。


对评论的回应:是的,优先级队列基于堆。

基本上,这两个类的定义如下:

public class Heap<T> : IEnumerable<T>, ICloneable { ... }
public class PriorityQueue<T> : Heap<PriorityQueueElement<T>> { ... }

PriorityQueueElement是一个具有Priority和Value属性的简单不可变结构。

对即将发表的评论的回应:由于优先级队列基于堆,因此“有趣的属性”是指通过其索引更改值的优先级意味着之后,值“赢了”必须在那个指数。我打算只记录这个,因为在某些情况下我预见到需要独立的定位/更改优先级操作。

1 个答案:

答案 0 :(得分:2)

我会将比较作为可选的构造函数参数;这与Dictionary<,>SortedList<,>等等允许您指定比较机制的方式相当。

是否接受IComparer<T>IEqualityComparer<T>取决于您是要对数据进行排序,还是仅查找相等匹配;如果匹配,那么你需要像IEqualityComparer<T>这样的东西。不幸的是,由于这有两种方法(GetHashCode()Equals()),因此除了Predicate<T>Func<T,T,bool>之外,没有直接的委托版本。

对于默认构造函数,我会传入[Equality]Comparer<T>.Default