まあ、スタティック comparerを使用すると、異なるキューで異なる比較を行うことはできません。これは問題になることがあります...時折人々を行うカスタム比較が必要です。たとえば、型を制御していない場合などです。私のデフォルトのアプローチは、
PriorityQueue<TPriority>
{
private IComparer<TPriority> _comparer;
public PriorityQueue(IComparer<TPriority> comparer) {
_comparer = comparer;
...
}
public PriorityQueue() : this(Comparer<T>.Default) {}
}
です。はい、私はいくつか書いた - 特にたとえば... LINQスタイルの投影する比較器を書き込むため、何かのように:
IComparer<Customer> comparer = ProjectionComparer<Customer>
.CompareBy(cust => cust.Name);
インスタンス「ソートを名前で」比較:できます
public static class ProjectionComparer<TSource>
{
public static IComparer<TSource> CompareBy<TValue>(
Func<TSource, TValue> selector)
{
return CompareBy<TValue>(selector, Comparer<TValue>.Default);
}
public static IComparer<TSource> CompareBy<TValue>(
Func<TSource, TValue> selector,
IComparer<TValue> comparer)
{
return new ProjectionComparerItem<TValue>(
selector, Comparer<TValue>.Default);
}
class ProjectionComparerItem<TValue> : IComparer<TSource>
{
private readonly IComparer<TValue> comparer;
private readonly Func<TSource, TValue> selector;
public ProjectionComparerItem(
Func<TSource, TValue> selector,
IComparer<TValue> comparer)
{
this.selector = selector;
this.comparer = comparer;
}
public int Compare(TSource x, TSource y)
{
// TODO: some null stuff...
return comparer.Compare(selector(x), selector(y));
}
}
}
。私は、少なくともいくつかのケースのためにそれで行くことが
private class PriorityQueueImpl<TPriority, TComparer> where TComparer : IComparer<TPriority> {
// all methods accept a TComparer
// generic in TComparer to avoid boxing for struct TComparers and permit inlining for sealed TComparers
}
public struct PriorityQueue<TPriority, TComparer> where TComparer : IComparer<TPriority> {
private readonly PriorityQueueImpl<TPriority, TComparer> _impl;
private readonly TComparer _comparer;
// methods delegate to _impl
}
:
これは良い例ですが、デフォルトのコンストラクタがないため、静的に誤って使用することはできませんでした。 –
'TComparer 'によるパラメータ設定のポイントは、異なる比較を可能にすることです。異なる比較を持つキューには異なるタイプがありますが、異なる比較を持つ(たとえば)キューをマージすることは意味がありません。 –
そして、私の指摘は、比較ごとに常に型が必要なわけではないということです。上記のクラスは、同じ型とのさまざまな比較を可能にします。なぜ人々はクラスを書くように強制するのですか? –