【问题标题】:Implementing IComparable using Framework 2.0使用 Framework 2.0 实现 IComparable
【发布时间】:2011-09-15 22:30:04
【问题描述】:

我正在尝试为 2.0 框架重构以下代码(工作中需要)。下面的代码是根据previous post 提供的,我在其中试图弄清楚如何对数组列表的字典进行排序。这与那次讨论有点背道而驰。下面是代码:

 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) => ?

感谢您的帮助。

【问题讨论】:

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


    【解决方案1】:

    IComparable 是您在您希望能够...可比较的类上实现的接口。 Sort 方法一开始就知道如何使用 IComparable 接口。因此,如果你想使用 Sort 方法进行排序,你的类必须实现 IComparable 否则,当你在你的类上调用 CompareTo 时,你希望排序算法如何知道你的类在逻辑上是如何排序的?

    这是IComparable 工作原理的一些背景知识,但除非我误读,否则这似乎不是问题所在。您似乎正在尝试:

    1. 用一堆整数填充OrderedByPopularity
    2. 对整数进行排序。

    如果你真的想对列表中的整数进行排序,你应该只需要使用

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

    int(这是List 中的元素类型)已经有CompareTo

    这能回答问题吗?

    【讨论】:

      【解决方案2】:

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

      因此,当您说 popList[i2].CompareTo(blah) 时,您正在调用不存在的对象上的函数。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多