cli C ++对某个属性

时间:2016-02-25 10:24:48

标签: sorting object c++-cli

我只是想对某个属性上的列表进行排序。

我有一个LinePiece对象,其中包含以下属性:

String^ Type;
int X, Y, X2, Y2;
System::String^ Text;

现在我有一个包含这些LinePieces的列表,我想在X value上对它们进行排序。

我在List->Sort();找到了一些东西但是我需要提供一些信息。但是我不知道如何告诉它在X值上对我的列表进行排序。

那么如何在列表中对对象的X值进行排序呢?

1 个答案:

答案 0 :(得分:2)

如果我在您的问题的行之间阅读,听起来有时您想要根据X值进行排序,有时您希望根据Y值进行排序。如果是这种情况,那么我实现一个Comparer对象,并将其传递给List->Sort()以指定它们的排序方式。

public ref class CompareByX : Comparer<LinePiece^>
{
public:
    virtual int Compare(LinePiece^ a,LinePiece^ b) override
    {
        return a->X.CompareTo(b->X);
    }
};

int main(array<System::String ^> ^args)
{
    List<LinePiece^>^ list = ...

    list->Sort(gcnew CompareByX());
}

另一方面,如果LinePiece有一个固有的,通用的排序顺序,那么我就在类上实现IComparable,并使用默认排序。但是,当您执行此操作时,您应该小心只在两个对象相等时返回0

执行此操作时,您不需要将任何额外参数传递给Sort(),因为对象已经知道如何对自己进行排序。

public ref class LinePiece : public IComparable<LinePiece^>
{
public:
    String^ Type;
    int X, Y, X2, Y2;
    String^ Text;

    virtual int CompareTo(LinePiece^ other)
    {
        int result = 0;

        if (result == 0) result = this->X.CompareTo(other->X);
        if (result == 0) result = this->Y.CompareTo(other->Y);
        if (result == 0) result = this->X2.CompareTo(other->X2);
        if (result == 0) result = this->Y2.CompareTo(other->Y2);
        if (result == 0) result = this->Type->CompareTo(other->Type);
        if (result == 0) result = this->Text->CompareTo(other->Text);

        return result;
    }
}

int main(array<System::String ^> ^args)
{
    List<LinePiece^>^ list = ...

    list->Sort();
}