我有一个函数我想写一个返回排序列表的地方。我想传递对象的自定义比较。下面的例子相当简单,但如果我能克服这个问题,我应该做好准备。
我尝试过声明正确类型的委托(我认为):
public delegate int ObjectSorter(MyObject x, MyObject y);
用正确的语法调用它:
GetList(delegate(MyObject a, MyObject b) { return a.CompareTo(b); });
但是当我将它传递给列表时,我发现存在参数问题:
public List<MyObject> GetList(ObjectSorter os)
{
List<MyObject> objectList = FillTheList();
objectList.Sort(os); // Invalid
return ObjectList;
}
所以尝试不同的方法:
GetList((x, y) => { return x.CompareTo(y); });
public List<MyObject> GetList(Func<MyObject, MyObject, int> sorter)
{
List<MyObject> objectList = FillTheList();
objectList.Sort(sorter); // Invalid also
// This syntax DOES work, but too specific. And why does it work?
nl.Sort((x, y) => x.CompareTo(y));
return ObjectList;
}
也不行。
我试图让调用者尽可能轻松地对函数进行自定义比较,并让函数尽可能少地了解排序本身的工作原理。我宁愿不让调用者经历创建从 IComparer 派生的类并将其传入的所有麻烦。