C ++,Net,WindowsForms按其他列表的值排序列表

时间:2011-10-05 11:53:49

标签: .net winforms c++-cli

我有两个清单。一个类型的MyClass,并填充了我写的这些类。第二个有一些int值。

问题是我不知道如何使用第二个列表的值来处理第一个列表的排序。 我不知道如何编写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]

有没有可能处理这个挑战?

3 个答案:

答案 0 :(得分:0)

如果在第二个列表中是唯一的int values,您可以使用std::vectorMyClass插入由您存储在第二个列表中的int值指示的位置。如果没有,请使用std::multiset作为密钥{/ 1}}。

答案 1 :(得分:0)

(不是特定于C ++ / CLI)

使用Dictionary<int, int>代替第二个列表:

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

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

  1. x.status
  2. 查找Dictionary的排序顺序
  3. y.status
  4. 查找Dictionary的排序顺序
  5. 直接比较这些排序顺序。
  6. ...然后将此比较器传递给List<T>.Sort(IComparer<T>)作为第一个列表。

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

答案 2 :(得分:0)

我设法击败了这个挑战:) 这是解决方案

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();

我感到很放心:)感谢您的任何建议。