2011-10-05 88 views
1

我有两个列表。一种是MyClass类型的,并且充满了我写的这些类。第二个有一些int值。C++,Net,WindowsForms按其他列表的值排序列表

问题是,我不知道如何处理使用第二个值的排序第一个列表。 我不知道如何编写一个IComparer来使用排序列表方法。我在msdn中看到了一个例子,但我不知道如何改变它。 http://msdn.microsoft.com/en-us/library/234b841s.aspx#Y535

这是我的计划:

// ##################################

ref class MyClass{ 
private: 
    int x; 
    int y; 
    String^ name; 
public: 
    MyClass(int x, int y, String^ name){ 
    this->x = x; 
    this->y = y; 
    this->name = name; 
} 
... 
}; 

//###### in some button which will initialize...: 

List<MyClass^>^ listMyClass = gcnew List<MyClass^>(3); 
listMyClass->Add(gcnew MyClass(3, 5, "class1")); 
listMyClass->Add(gcnew MyClass(1, 2, "class2")); 
listMyClass->Add(gcnew MyClass(6, 8, "class3")); 

List<int>^ numbers = gcnew List<int>(3); 
numbers->Add(2); 
numbers->Add(4); 
numbers->Add(1); 

// ###################################

这些数字数字List代表listMyClass元素的某种状态。所以我想使用列表中的值对listMyClass进行排序。 我想排序后有这样的结果: listMyClass[1]是第一个,因为列表中的数字4是最高的。然后 listMyClass[0]然后listMyClass[2]

有没有处理这个挑战的任何可能性?

回答

0

如果在第二个列表中是唯一的int values,则可以使用std::vectorMyClass插入到您存储在第二个列表中的int值所指示的位置。如果没有,请使用int values作为关键字std::multiset

0

(不针对C++/CLI)代替第二列表

使用Dictionary<int, int>

  • 关键是状态。
  • 值是该状态的排序顺序

然后,您可以轻松地实现自定义IComparer<T>.Compare(T x, T y)那会...

  1. 查找从Dictionaryx.status的排序顺序。
  2. Dictionary查找y.status的排序顺序。
  3. 直接比较这些排序顺序。

...然后将此比较器传递给List<T>.Sort(IComparer<T>)作为第一个列表。

P.S.对于本机C++解决方案,您可以使用与std::unordered_map<int, int>类似的想法。

0

我设法击败这个challange :) 这里的解决方案

ref class MyClass:IComparable<MyClass^>{ 
public: 
    int x; 
    int y; 
    int status; 
    String^ name; 

    MyClass(int x, int y, String^ name){ 
    this->x = x; 
    this->y = y; 
    this->name = name; 
    } 

    virtual int CompareTo(MyClass^ tmpMyClass){ 
     if(this->status > tmpMyClass->status) 
     return 1; 
     if(this->status < tmpMyClass->status) 
     return -1; 
     else 
     return 0; 
    } 
... 
}; 

//###### in some button which will initialize...: 

List<MyClass^>^ listMyClass = gcnew List<MyClass^>(3); 
listMyClass->Add(gcnew MyClass(3, 5, "class1")); 
listMyClass->Add(gcnew MyClass(1, 2, "class2")); 
listMyClass->Add(gcnew MyClass(6, 8, "class3")); 

List<int>^ numbers = gcnew List<int>(3); 
numbers->Add(2); 
numbers->Add(4); 
numbers->Add(1); 

for(int i=0; i<listMyClass->Count; i++){ 
    listMyClass->status = numbers[i]; 
} 
listMyClass->Sort(); 

我觉得这样的救济:)谢谢你的任何建议。