IComparer.CompareTo(对象a,对象b)

时间:2014-08-25 15:02:44

标签: c# compareto icomparer

我有一个包含10个或更多Level个对象的Arraylist。这些对象都具有级别ID。 我现在尝试写一个IComparer.CompareTo(Level a,Level b)。 我真的不知道如何实现这一点。从未与IComparer合作,当我阅读MSDN Libary时,我并没有变得更聪明。

我试过了:

  public int CompareTo(Level a, Level b)
    {
        if (a.LevelID < b.LevelID)
        {
            return -1;
        }
        else if (a.LevelID == b.LevelID)
        {
            return 0;
        }
        else
            return 1;
    }
this._alLevel.Sort(CompareTo(Level[0],Level[1])

_alLevelArraylist我的Level对象。

我是初学者......

2 个答案:

答案 0 :(得分:2)

我强烈建议您将级别存储在通用List<Level>中。它保证了代码中的类型安全性,并通过消除将对象运行时转换为期望类型的需要来提高性能。

但是,如果您决定使用非泛型ArrayList,则必须创建一个实现非通用IComparer接口的比较器,如下所示:

public class LevelComparer : IComparer<Level>, IComparer
{
    #region IComparer<Level> Members

    public int Compare(Level x, Level y)
    {
        if (object.ReferenceEquals(x, y))
            return 0;
        if (x == null)
            return 1;
        else if (y == null)
            return -1;
        return x.LevelID.CompareTo(y.LevelID);
    }

    #endregion

    #region IComparer Members

    public int Compare(object x, object y)
    {
        return Compare(x as Level, y as Level);
    }

    #endregion
}

(请注意,我的比较器也实现了通用IComparer<Level>接口,因此您可以将其与List<Level>一起使用。此外,如果对象无法转换为Levels,则会进行空检查。纯粹的通用比较器我可能不会打扰。)

接下来,将比较器的一个实例传递给你的arraylist的sort method

arrayList.Sort(new LevelComparer());

答案 1 :(得分:1)

我想你的_alLevel是List<Level>

然后,您需要实施IComparer<Level>,例如

 public class LevelComparator: IComparer<Level> {
  public int CompareTo(Level a, Level b)
  {
    if (a.LevelID < b.LevelID)
    {
        return -1;
    }
    else if (a.LevelID == b.LevelID)
    {
        return 0;
    }
    else
        return 1;
  }
}

然后,您可以实例化比较器并将其传递给Sort

  this._alLevel.Sort(new LevelComparator());

在里面,Sort方法将使用CompareTo方法执行排序