gpt4 book ai didi

c# - 使用带有委托(delegate)函数的 IComparer<> 进行搜索

转载 作者:行者123 更新时间:2023-11-30 19:07:50 25 4
gpt4 key购买 nike

用谷歌搜索这个问题感觉太简单了,我想/希望我在尝试实现我自己的版本时陷入了细节。我要做的是根据我的数据类型对象对 MyClass 对象列表进行排序,应该使用不同的搜索函数。

对于数据类型类,我有这样的想法:

class Datatype {
public delegate int CMPFN(object x, object y);
private CMPFN compareFunction;

(...)

private XsdDatatype((...), CMPFN compareFunction) {
(...)
this.compareFunction = compareFunction;
}

public CMPFN GetCompareFunction() {
return this.compareFunction;
}

static private int SortStrings(object a, object b) {
return ((MyClass)a).GetValue().CompareTo(((MyClass)b).GetValue());
}
}

稍后我尝试对 MyClass 列表进行排序,如下所示:

List<MyClass> elements = GetElements();
Datatype datatype = new Datatype((...), Datatype.SortStrings);
elements.Sort(datatype.GetCompareFunction()); // <-- Compile error!

我对 Datatype.SortStrings 中的转换并不过分兴奋,但感觉这可行(?)。然而,编译器不同意并在上面的最后一行给我这个错误,我有点不确定为什么 CMPFN 不能转换/转换(?)到 IComparer。

Cannot convert type 'proj.Datatype.CMPFN' to 'System.Collections.Generic.IComparer<proj.MyClass>'

最佳答案

委托(delegate)不是那种鸭子类型的人。您可以创建 Comparison<MyClass>来自CMPFN但您不能使用普通引用转换 - 无论是隐式还是显式。

三个选项:

  • 像这样创建比较器:

    elements.Sort(new Comparison<MyClass>(datatype.GetCompareFunction()));
  • 使用 lambda 表达式创建 Comparison<T>并改用它:

    elements.Sort((x, y) => datatype.GetCompareFunction()(x, y));
  • 编写 IComparer<MyClass> 的实现它根据 CMPFN 执行比较

请注意,第二种方法将调用 GetCompareFunction每次比较一次。

一个更好的解决方案是摆脱CMPFN完全 - 为什么不直接使用(或实现)IComparer<MyClass>开始?请注意,这也会删除类型转换。 (如果您乐于使用委托(delegate)而不是接口(interface),则可以将比较表示为 Comparison<MyClass>。)

请注意,从 .NET 4.5 开始,您可以使用 Comparer.Create 创建一个 Comparer<T>来自Comparison<T>委托(delegate)。

我不确定为什么您当前的 API 是关于 object 的,但您应该知道,在 C# 3 及更早版本(或针对​​ .NET 3.5 及更早版本的 C# 4)中,您将无法转换 IComparer<object>。进入 IComparer<MyClass> (无论如何,通过引用转换)。从 C# 4 开始,由于泛型逆变,您可以。

关于c# - 使用带有委托(delegate)函数的 IComparer<> 进行搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3210305/

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