【问题标题】:Getting compilation error while trying to sort an array in C#尝试在 C# 中对数组进行排序时出现编译错误
【发布时间】:2011-12-09 01:08:56
【问题描述】:

我在 C# 中做需要对数组进行排序的作业。我可以使用

对整数数组进行排序
Array.sort<int>(a, delegate(int x, int y) { return y-x;});

但是,如果我想从特定位置和特定长度进行操作

Array.sort<int>(a, 0, m, delegate(int x, int y) { return y-x;});

我收到编译错误:“无法将匿名方法转换为类型 'System.Collections.Generic.IComparer',因为它不是委托类型”。 我已经通过使用解决了这个问题

Array.sort<int>(a, 0, m);

并向后做所有其他事情。为什么它给了我一个错误,如何改变它来工作?

感谢您的帮助

【问题讨论】:

  • 尝试在MSDN上找到你调用的方法,看看它的参数是什么类型。

标签: c# arrays sorting delegates integer


【解决方案1】:

第一个例子调用的方法有签名:

Array.Sort(int[] array, Comparison<int> comparison) 

您使用的委托用于比较。 Array.Sort 不存在具有索引、长度比较的重载。

您尝试调用的方法具有以下签名:

Array.Sort(int[] array, int index, int length, IComparer<int> comparer) 

注意 IComparer,而不是比较

如果您需要自定义排序。您将需要创建一个实现 IComparer 的类,因为这是第四个参数所期望的。

或者,尝试使用 .OrderByDescending 扩展方法,当您包含 using System.Linq; 时该方法可用

【讨论】:

  • 感谢.OrderByDescending(),我已经找了一段时间了!
【解决方案2】:

如果您不需要自定义比较器,请将 null 作为第四个参数传递。

如果这样做,您需要一个专门从 IComparer 继承的参数——您不能只使用匿名委托。

http://msdn.microsoft.com/en-us/library/system.collections.icomparer.aspx

【讨论】:

    最近更新 更多