CLI数组排序
2020-11-01 本文已影响0人
左图右码
数组排序(Array::sort)
静态函数System::Array::Sort
可对cli::array<T>
进行排序。
Sort函数有17个,如下:
![](https://img.haomeiwen.com/i8721097/257fe5dba4ad179b.jpg)
最直接的排序需要类型T
实现了System::IComparable
接口.
ref class testclass : public System::IComparable
{
public:
testclass(int i) :m_i(i) {}
int m_i;
virtual Int32 CompareTo(System::Object^ obj)
{
if (auto v = dynamic_cast<testclass^>(obj))
{
return this->m_i < v->m_i;
}
else
{
throw gcnew System::ArgumentException("");
}
}
};
//直接的排序
cli::array<testclass^>^ arr = {gcnew testclass(111),gcnew testclass(2),gcnew testclass(3)};
System::Array::Sort(arr);
使用排序准则System::Comparison<T>
System::Comparison<T>
是cli定义的委托,可以通过该委托调用自定义的函数进行比较
ref class testclass
{
public:
testclass(int i) :m_i(i) {}
int m_i;
};
//定义排序准则函数
Int32 compareClass(testclass^ a, testclass^ b)
{
return a->m_i > b->m_i;
}
//用委托调用排序准则函数
cli::array<testclass^>^ arr = {gcnew testclass(111),gcnew testclass(2),gcnew testclass(3)};
auto compare = gcnew System::Comparison<testclass^>(compareClass);
System::Array::Sort(arr, compare);
使用范型接口
System::Collections::Generic::IComparer<T>
是个范型接口,用特定类型实现它以后,可用于排序。
ref struct compareStr : System::Collections::Generic::IComparer<testclass^>
{
virtual Int32 Compare(testclass^ x, testclass^ y)
{
return x->m_i < y->m_i;
}
};
//使用接口类排序
System::Array::Sort(arr, gcnew compareStr);
使用CLI接口
与范型接口不同,使用CLI接口则需要进行拆箱操作,显式拆箱操作需要考虑失败的处理。
ref struct compareStrCli : System::Collections::IComparer
{
virtual Int32 Compare(System::Object^ x, System::Object^ y) override
{
auto xo = dynamic_cast<testclass^>(x);
auto yo = dynamic_cast<testclass^>(y);
if (xo && yo)
{
return xo->m_i < yo->m_i;
}
else
{
throw gcnew System::InvalidCastException("");
}
}
};
//使用cli接口,需要拆箱的操作
System::Array::Sort(arr, gcnew compareStrCli);
注意:两个接口处于不同的namespace:
System::Collections::IComparer
System::Collections::Generic::IComparer<T>
图示里的前8种都是旧式的方法,应该优先使用更先进的范型接口和类。