我有一个名为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();
}
}
答案 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))