使用Framework 2.0实现IComparable

时间:2011-09-15 14:18:26

标签: c# sorting collections compact-framework2.0

我正在尝试重构2.0框架的下面代码(在工作中需要)。下面的代码是根据previous post提供的,其中我试图弄清楚如何对arraylists字典进行排序。这与讨论有点相似。以下是代码:

 MultiDimDictList myDicList = new MultiDimDictList();
myDicList.Add("fly", a_fly);
myDicList.Add("img", a_img);
myDicList.Add("bar", a_bar);
myDicList.Add("meter", a_meter);
myDicList.Add("block", a_block);
myDicList.Add("popularity", a_pop); 

List<int> OrderedByPopularity = new List<int>();
ArrayList popList = myDicList["popularity"];

for (int i = 0; i < popList.Count; ++i)
{
    OrderedByPopularity.Add(i);
}

OrderedByPopularity.Sort((i1, i2) => 
{ 

    return popList[i2].CompareTo(popList[i1]); 

});

当我尝试运行上面的代码时,最底层的逻辑给我带来了问题 - 即,“CompareTo”无法识别。我已经对此做了一些阅读,看起来我必须实现IComparable才能使其工作,但我可以在这里使用一些帮助/建议。我应该在哪里实施IComparable?此外,编译器还告诉我使用“委托”作为我的.Sort方法。我是对的,它应该是这样的:.Sort(delegate(int i1,int i2)=&gt;?

感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

问题是ArrayList返回对象。 Object没有实现IComparable。

所以当你说popList [i2] .CompareTo(blah)时,你正在调用一个不存在的对象上的函数。

答案 1 :(得分:0)

IComparable是一个接口,您可以在一个类上实现,以便能够......具有可比性。 Sort方法知道如何直接使用IComparable接口。因此,如果您想使用Sort方法进行排序,那么您的类必须实现IComparable否则,当您在课程上调用CompareTo时,您希望排序算法如何知道您的课程逻辑分类?

这是关于IComparable如何运作的一些背景知识,但除非我误读,否则它看起来不像是问题。看起来你正试图:

  1. 使用一堆整数填充OrderedByPopularity
  2. 对整数进行排序。
  3. 如果你真的想要对列表中的整数进行排序,你应该只需要使用

    (i1, i2) => 
    { 
        return i1.CompareTo(i2); 
    }
    

    intList中的元素类型)已经有CompareTo

    这是否回答了这个问题?