如何编写通用的ISort接口?

时间:2012-04-03 05:33:19

标签: c# generics sorting interface

我想创建各种排序类(QuickSort,MergeSort,BucketSort等)。 我有一个通用的接口(ISort)。

此界面有一个方法:

Collection<T> Sort(Collection<T> list);

现在,当我试图使用一个类时,似乎我必须这样声明:

ISort<char> sort = new QuickSort();

QuickSort实现如下所示:

public class QuickSort : ISort<char>
    {
        public Collection<char> Sort(Collection<char> list)
        {
            // TODO: implement this.
            return null;
        }
    }

这个实现是我不喜欢的,因为T模板是一个char。 我如何保持这个类通用,以便我可以使用这个类来对int,float,double,char等进行排序?

2 个答案:

答案 0 :(得分:2)

就像这样:

public class QuickSort<T> : ISort<T>
    {
        public Collection<T> Sort(Collection<T> list)
        {
            // TODO: implement this.
            return null;
        }
    }

ISort<char> sort = new QuickSort<char>();

答案 1 :(得分:1)

排序与正在排序的集合中的数据类型无关,因此您不应在类级别强制使用类型参数。此外,您还需要比较对象,以便它们实现IComparable。

您可以像这样设计界面,并避免将排序类的实例绑定到它将要排序的类型:

interface ISort
{
    ICollection<T> Sort<T>(ICollection<T> collection) where T : IComparable<T>;
}

class QuickSort : ISort
{
    public ICollection<T> Sort<T>(ICollection<T> collection) where T : IComparable<T>
    {
        Comparer<T> comparer = Comparer<T>.Default;
        // TODO: Implement
        return collection;
    }
}

然后,您可以对所有数据类型使用相同的排序对象。此设计的一个缺点是,您将无法根据泛型类型参数存储特定的状态。因此,QuickSort不能包含使用通用类型参数T的字段。