【发布时间】:2020-08-25 14:06:15
【问题描述】:
我的 c# 控制台应用程序上有这个类
public class Person
{
public Person(int id , string l, string f)
{
FirstName = f;
LastName = l;
Id = id;
}
public int Id {get;set;}
public string FirstName {get;set;}
public string LastName {get;set;}
}
在我的 Main 方法中,我有以下代码:
public static void Main(string[] args)
{
Person[] p = new Person[3];
p[0] = new Person(8,"John", "Doe");
p[1] = new Person(9,"Adam", "Cas");
p[2] = new Person(1,"Oliver", "Anderson");
Array.Sort(p); // this doesn't work, i get InvalidOperationException
}
如果它是简单类型的数组,如字符串、整数、..等,我可以轻松使用Array.Sort(myarray),然后将其排序。但是当我使用Array.Sort(p) 时,我得到一个异常(InvalidOperationException)。
正如Array.Sort 上的文档所说,这确实是预期的异常
无效操作异常 数组中的一个或多个元素没有实现
IComparable接口。
不幸的是,所有示例都显示了如何为字符串实现IComparer,而我需要能够按对象(Id、FirstName、LastName)的字符串 property 进行排序。并且没有我的对象可能需要实施的IComparable 样本。
这是文档中的一个示例:
public class ReverseComparer : IComparer
{
// Call CaseInsensitiveComparer.Compare with the parameters reversed.
public int Compare(Object x, Object y)
{
return (new CaseInsensitiveComparer()).Compare(y, x );
}
}
确实有IComparer 的样本(如Using IComparer for sorting),但它们显示IComparer<T>... 还有IComparable 的样本是相应的文档IComparable 但那是用于非字符串的温度属性。
【问题讨论】:
-
@devNull to sort 我想选择我的一个属性进行排序,Id、FirstName 或 LastName。