在C#中对IComparable对象性能进行排序

时间:2010-08-19 05:11:58

标签: c# sorting c#-3.0 list icomparable

我设计了一个类,它基本上只是一个存储一段数据的大量属性的对象。我在课堂上实现了IComparable。该类的对象被实例化并存储在List中。

还有一个复杂程度,即对象的某些字段决定了我排序的字段(有一个层次结构)因此层次结构是:

  • 1)名称(在实例化时定义)
  • 2)产品(在实例化时定义)
  • 3)NetGroup(已定义 实例化后,在初始之后 创建列表,我迭代回来 通过,执行计算,和 设置组。)
  • 4)日期(在实例化时定义)

有几个标志(bool字段)确定是否在排序层次结构中使用了上述两个。

  • 5)AllowProductGroupingInd(已定义 在实例化)
  • 6)AllowDateGroupingInd(定义于 实例化)

在相对较小的列表(n = 1000)上进行排序的性能很差,通常约为500毫秒。

我不确定我是否正确实施了比较器。 我的方法如下:

    public int CompareTo(Exposure rfpe)
            {
                if (Name.CompareTo(rfpe.Name) != 0)
                    return Name.CompareTo(rfpe.Name);
                else
                {
                    if (AllowProductGroupingInd == false)
                    {
                        if (ProductId.CompareTo(rfpe.ProductId) != 0)
                            return ProductId.CompareTo(rfpe.ProductId);
                    }

                    if (NetGroup.CompareTo(rfpe.NetGroup) != 0)
                        return NetGroup.CompareTo(rfpe.NetGroup );
                    else if (AllowDateGroupingInd == false)
                    {
                        if (Date.CompareTo(rfpe.Date) != 0)
                            return Date.CompareTo(rfpe.Date);
                        else
                            return 0;
                    }

                    return 0;
                }

            }

我正在使用C#3.0,所以我不能使用LINQ。这是我想要完成的合理实施吗?有更优雅的解决方案吗?在我看来,我可能会使用太多的条件,但我不确定如何解决这个问题。

1 个答案:

答案 0 :(得分:0)

您似乎是双重调用每个辅助CompareTo方法,第一个方法很可能是性能方面的罪魁祸首。

int nameCompare = Name.CompareTo(rfpe.Name);

if (nameCompare != 0)
   return nameCompare;
else
   ...