【发布时间】:2011-12-20 10:08:24
【问题描述】:
我了解如何将 IComparer 接口与提供自定义排序方式的帮助类一起使用。例如,这是一个典型的例子,它和我在网上看到的所有例子非常相似,包括微软的在线帮助页面:
// This helper class is used to sort an array of people by name,
// where 'Person' is a class type.
public class PeopleNameComparer : IComparer
{
// Test the name of each object.
int IComparer.Compare(object o1, object o2)
{
Person p1 = o1 as Person;
Person p2 = o2 as Person;
if (p1 != null && p2 != null)
return string.Compare(p1.Name, p2.Name);
else
throw new ArgumentException("Parameter is not a Person!");
}
}
我也明白,如果我们有一个 Person (myPeople) 类型的数组,那么我们可以使用以下命令对该数组进行排序:
Array.Sort(myPeople, new PeopleNameComparer());
在这种情况下,我们将创建一个新的 IComparer 类型的 PeopleNameComparer 对象,并将其作为第二个参数传递给 Array.Sort() 方法。
现在为了让事情更整洁,我们可以实现一个属性来为对象用户提供一种更友好的方式来调用自定义排序:
public static IComparer SortByName
{ get { return (IComparer)new PeopleNameComparer(); } }
我不明白这种属性是为什么所有示例都使用 (IComparer) 强制转换将新创建的帮助器类(在此示例中为 PeopleNameComparer)转换为 IComparer 对象,而该对象已经是类型比较器?我试过没有演员表,代码似乎工作正常:
// This property seems to work fine without the cast?
public static IComparer SortByName
{ get { return new PeopleNameComparer(); } }
如果 'new' 关键字返回一个普通的 System.Object 类型,然后必须将其强制转换为适当的 IComparer,我可以理解它,但在这里看不到强制转换的必要性。 但是我按照微软的例子,我的例子和我的 Pro C# 书中的例子很相似。
这里有什么理由需要演员表吗?
【问题讨论】:
-
你的问题标题和实际问题之间有什么联系?
-
好的,感谢您更新问题。