gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 04:50:04 25 4
gpt4 key购买 nike

这个问题涉及本质上相同代码的 2 个不同实现。

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

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);

我的问题是:

  • 每种实现方式的优点和缺点是什么?
  • 还有哪些方法可以利用这些实现方案中的每一个?
  • 有没有一种方法可以将这些实现结合起来,这样我就不需要重复代码了?
  • 我能否仅使用其中一种实现方式同时实现二分搜索和替代集合排序?

最佳答案

就性能而言,这两种选择都没有优势。这实际上是一个方便和代码可维护性的问题。选择您喜欢的选项。话虽如此,所讨论的方法略微限制了您的选择。

您可以使用 IComparer<T> List<T>.Sort 的接口(interface),这样您就不会重复代码。

不幸的是,BinarySearch不使用 Comparison<T> 实现选项, 所以你不能使用 Comparison<T>委托(delegate)该方法(至少不是直接委托(delegate))。

如果你真的想使用 Comparison<T>对于两者,您可以制作一个通用的 IComparer<T>实现 Comparison<T>在其构造函数中委托(delegate),并实现 IComparer<T> .

public class ComparisonComparer<T> : IComparer<T>
{
private Comparison<T> method;
public ComparisonComparer(Comparison<T> comparison)
{
this.method = comparison;
}

public int Compare(T arg1, T arg2)
{
return method(arg1, arg2);
}
}

关于c# - 比较对象的不同实现的优点/缺点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2488298/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com