目的:使用我类的属性对多个选项进行排序。我设法使用可比较的samAccountName进行排序,但未能正确实现IComparer。但是要知道我得到了下面指定的一个错误。
错误:未实现接口成员System.Collections.Icomparer
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;
namespace ActiveDirectory
{
public class sortLastName : IComparer
{
int IComparer.CompareTo(Employee oEmployee, Employee oEmployee2)
{
return String.Compare(oEmployee.lastName, oEmployee2.lastName);
}
public static IComparer sortYearAscending()
{
return (IComparer)new sortLastName();
}
}
//The code works great when I make a call like
// List<Employee> x = new List<Employee>();
// x.sort();// sorts by samAccountName
// Now I would like to figure out how to sort by lastName and still be able to sort by
//samAccountName if necceaary.
public class Employee :IComparable
{
//default sort order
public int CompareTo(object oEmployee)
{
Employee emp1 = (Employee)oEmployee;
return String.Compare(this.samAccountName, emp1.samAccountName);
}
public string lastName
{
get;
set;
}
public string samAccountName
{
get;
set;
}
}
}发布于 2011-08-29 18:24:36
您需要为您的sortLastName-class实现IComparer实现一个名为“sortLastName”而不是“IComparer”的方法。
然后您可以使用这个x.Sort对过载进行排序。
x.Sort(new sortLastName());这是您应该使用的实现:
public class sortLastName : IComparer<Employee>
{
public int Compare(Employee oEmployee, Employee oEmployee2)
{
return String.Compare(oEmployee.lastName, oEmployee2.lastName);
}
}(请注意,我没有更改名称,因为您不会再看到上下文了,但是sortLastName不是比较者的好名称)
发布于 2011-08-29 18:24:42
我完全不知道您的IComparer实现的目的是什么。
您可能应该实现IComparable<T>,而不是非一般的IComparable,但无论如何。
无论哪种方式,都要将您想要的排序顺序合并到您的CompareTo函数中。例如:
public int CompareTo(object oEmployee)
{
Employee e = (Employee)oEmployee;
int cmp = 0;
if ((cmp = string.Compare(this.samAccountName, e.samAccountName) != 0)
return cmp;
if ((cmp = string.Compare(this.lastName, e.lastName) != 0)
return cmp;
// ...any other properties you care to compare by
// else it's a tie:
return cmp;
}然后,这应该在List<T>.Sort中正确工作,因为默认比较器将在您的类型上查找IComparable的实现。
编辑:在重读时,我不确定你是想按一个标准排序,还是按另一个标准排序,还是两者兼而有之。但我会把这个答案留给后人,以防你想把这两种情况都分类。
发布于 2011-08-29 18:30:50
IComparer。比较以两个对象作为参数。您在类sortLastName中不使用该签名。还有一个通用版本,如果这是你想要的界面.
IComparer:http://msdn.microsoft.com/en-us/library/system.collections.icomparer.compare(v=vs.71).aspx
https://stackoverflow.com/questions/7234128
复制相似问题