Array.Sort()试图实现IComparable进行排序

时间:2012-11-13 09:22:31

标签: c# sorting

我试图在学习排序数组时遵循一些例子。示例使用Id作为整数来排序此属性,因为我的对象使用Guid数据类型而不是int我决定使用Created DateTime属性来排序数组。这是代码

Car.cs
    public class Car:ICar,IComparable
    {
       ... properties
       int IComparable.CompareTo(object)
       {
          Car temp = obj as Car;
          if (temp != null)
          {
             if (this.Created > temp.Created)
                return 1;
             if (this.Created < temp.Created)
                return -1;
            else 
                return 0;
          }
          else {throw new ArgumentException("Parameter is not a Car object");}
       }
    }

Garage.cs

public class Garage : IEnumerable
    {
        private Car[] cars = new Car[4];

        public Garage()
        {
            cars[0] = new Car() { Id = Guid.NewGuid(), Name = "Corolla", Created = DateTime.UtcNow.AddHours(3), CurrentSpeed = 90 };
            cars[1] = new Car() { Id = Guid.NewGuid(), Name = "Mazda", Created = DateTime.UtcNow.AddHours(2), CurrentSpeed = 80 };
        }
       ...
}

Program.cs的

 static void Main(string[] args)
        {
           Garage cars = new Garage();
           Console.WriteLine("sorting array:");
           Array.Sort(cars); // error occured
        }

错误2参数1:无法从'Car'转换为'System.Array'

2 个答案:

答案 0 :(得分:1)

此解决方案假定您要对数组进行排序,而不是创建新数组。

Garage类中添加一个方法(这样就不必暴露内部数组):

public void Sort() {
    Array.Sort(cars);
}

然后从您的程序中调用此方法:

static void Main(string[] args)
{
    Garage garage = new Garage();
    garage.Sort();
    //It should be sorted now if you enumerate over it!
}

我冒昧地打电话给你的Garage对象garage而不是cars,这可能令人困惑。

我没有对此进行测试,但它非常简单,它应该可以正常工作。

答案 1 :(得分:0)

您的private Car[] cars是在一个区块内(花括号之间)定义的,当您编写Array.Sort(cars)时,您在该区块之外引用它。

所以你可以在某处定义一个错误类型的变量cars

如果在定义数组的同一个块中执行Array.Sort,它将起作用。