c# – 比较对象的不同实现的优点/缺点

这个问题涉及到基本上相同代码的两种不同的实现。

首先,使用委托创建一个比较方法,可以在排序对象集合时用作参数:

class Foo
{
    public static Comparison<Foo> BarComparison = delegate(Foo foo1, Foo foo2)
    {
        return foo1.Bar.CompareTo(foo2.Bar);
    };
}

当我想要使用一种比我的CompareTo函数提供的方法更有趣的方法来排序一个Foo对象的集合。例如:

List<Foo> fooList = new List<Foo>();
fooList.Sort(BarComparison);

二,使用IComparer:

public class BarComparer : IComparer<Foo>
{
    public int Compare(Foo foo1, Foo foo2)
    {
        return foo1.Bar.CompareTo(foo2.Bar);
    }
}

当我想对Foo对象的集合中的Foo对象进行二进制搜索时,我使用上面的代码。例如:

BarComparer comparer = new BarComparer();
List<Foo> fooList = new List<Foo>();
Foo foo = new Foo();
int index = fooList.BinarySearch(foo, comparer);

我的问题是:

>这些实现的优点和缺点是什么?
>有哪些更多的方法来利用这些实现?
>有没有办法结合这些实现方式,我不需要复制代码?
>我可以使用这些实现中的1个来实现二进制搜索和替代集合排序吗?

可能是接受比较< T>相对于IComparer< T>是编写匿名方法的能力。如果我有的话,列表< MyClass>,其中MyClass包含应该用于排序的ID属性,我可以写:

myList.Sort((c1, c2) => c1.ID.CompareTo(c2.ID));

比起编写整个IComparer< MyClass&gt实现。 我不知道接受一个I​​Comparer< T>除了与旧版代码(包括.NET Framework类)的兼容性以外,它除了具有主要优点外,还有其优点。比较器< T> .Default属性对于原始类型是非常有用的;其他一切通常需要额外的工作来编写代码。

为了避免代码重复,当我需要使用IComparer< T>,我通常做的一件事是创建一个通用的比较器,如下所示:

public class AnonymousComparer<T> : IComparer<T>
{
    private Comparison<T> comparison;

    public AnonymousComparer(Comparison<T> comparison)
    {
        if (comparison == null)
            throw new ArgumentNullException("comparison");
        this.comparison = comparison;
    }

    public int Compare(T x, T y)
    {
        return comparison(x, y);
    }
}

这允许编写代码,如:

myList.BinarySearch(item,
    new AnonymousComparer<MyClass>(x.ID.CompareTo(y.ID)));

这不是很漂亮,但它节省了一些时间。

这是一个有用的类:

public class PropertyComparer<T, TProp> : IComparer<T>
    where TProp : IComparable
{
    private Func<T, TProp> func;

    public PropertyComparer(Func<T, TProp> func)
    {
        if (func == null)
            throw new ArgumentNullException("func");
        this.func = func;
    }

    public int Compare(T x, T y)
    {
        TProp px = func(x);
        TProp py = func(y);
        return px.CompareTo(py);
    }
}

您可以编写为IComparer< T>设计的代码如:

myList.BinarySearch(item, new PropertyComparer<MyClass, int>(c => c.ID));
http://stackoverflow.com/questions/2488298/advantages-disadvantages-of-different-implementations-for-comparing-objects

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:c# – 比较对象的不同实现的优点/缺点