CompareTo()方法不起作用

时间:2014-11-05 15:57:19

标签: c# sorting icomparer

我有一个名为Person的类,它实现了IComparable<int>通用接口。我有一个包含Person对象的通用列表,我将我的列表分配给一个数组,我正在对列表进行排序,但我正在采取以下错误。

  

错误:{“无法比较数组中的两个元素。”}

这是我的Person类

public class Person : IComparable<int> 
    {
        public int Age { get; set; }

        public int CompareTo(int other)
        {
            return Age.CompareTo(other);
        }
    }

和这个程序cs

class Program
{
    static void Main(string[] args)
    {
        List<Person> list2 = new List<Person>();

        list2.Add(new Person() { Age = 80 });
        list2.Add(new Person() { Age = 45 });
        list2.Add(new Person() { Age = 3 });
        list2.Add(new Person() { Age = 77 });
        list2.Add(new Person() { Age = 45 });

        Person[] array = list2.ToArray();
        Array.Sort(array);

        foreach (Person item in array)
        {
            Console.WriteLine(item.Age);
        }

        Console.ReadKey();
    }
}

4 个答案:

答案 0 :(得分:10)

将您的班级更改为:

public class Person : IComparable<Person> 
{
    public int Age { get; set; }

    public int CompareTo(Person other)
    {
        return Age.CompareTo(other.Age);
    }
}

如果使用IComperable<int>创建类,则可以将其与int进行比较,而不是使用相同的类。 您必须将与您要比较的类相同的类/结构传递给模板。

答案 1 :(得分:4)

您需要将通用更改为Person,因为您要将Person与Person进行比较,而不是将Person更改为int:

public class Person : IComparable<Person>
    {
        public int Age { get; set; }


        public int CompareTo(Person other)
        {
            return Age.CompareTo(other.Age);
        }
    }

此外,您之后不需要转换为数组,您可以将其保存为列表:

List<Person> list2 = new List<Person>();

            list2.Add(new Person() { Age = 80 });
            list2.Add(new Person() { Age = 45 });
            list2.Add(new Person() { Age = 3 });
            list2.Add(new Person() { Age = 77 });
            list2.Add(new Person() { Age = 45 });

            list2.Sort();

            foreach (Person item in list2)
            {
                Console.WriteLine(item.Age);
            }

答案 2 :(得分:2)

使用: -

public class Person : IComparable<Person>
    {
        public int Age { get; set; }

        public int CompareTo(Person other)
        {
            return this.Age.CompareTo(other.Age);
        }
    }

您的自定义比较器错误! CompareTo()方法返回一个整数,表示: -

 0 -> Current instance is equal to the object being compared.
>0 -> Current instance is greater than the object being compared.
<0 -> Current instance is less than the object being compared.

当您致电Array.Sort(array);时,实际上是在传递一个数组对象,但问题是您已经实现了IComparable类型的int

答案 3 :(得分:1)

您可以将Icompareable<Person>作为其他答案状态实施,也可以实施IComparable,如:

public class Person : IComparable
{
    public int Age { get; set; }

    public int CompareTo(int other)
    {
        return Age.CompareTo(other);
    }

    public int CompareTo(object obj)
    {
        Person otherPerson = obj as Person;
        if (obj == null)
            return 0;
        else
        {

            return Age.CompareTo(otherPerson.Age);
        }
    }
}

您也可以使用LINQ订购您的列表,如:

foreach (Person item in list2.OrderBy(r=> r.Age))