2011-10-05 41 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(); 

我覺得這樣的救濟:)謝謝你的任何建議。