IComparer problem
本文关键字:problem IComparer | 更新日期: 2023-09-27 18:07:02
目的:使用我的类的属性有多个排序选项。我设法使用samAccountName使用Comparable排序,但未能正确实现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;
}
}
}
你需要实现一个名为"Compare"而不是"CompareTo"的方法为你的sortLastName
-class实现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不是比较器的好名字)
我完全不知道你的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
的实现。
编辑:重读一遍,我不确定你是想按一个标准排序,另一个,还是两个都排序。但我将把这个答案留给后人,以防你想同时对这两个词进行排序。
IComparer。Compare接受两个对象作为实参。你不用在类sortLastName中使用那个签名。还有一个通用版本,如果这是你想要的接口…
IComparer:http://msdn.microsoft.com/en-us/library/system.collections.icomparer.compare (v = vs.71) . aspx
您根本不需要IComparer或IComparable来实现这一点。
List<Employee> sortedByLastname = lstEmployee.OrderBy(x => x.LastName);
实现://假设这将用雇员填充列表。//听了你的建议,我就这么做了。
<>之前公共部分类Form1: Form{公共Form1 (){InitializeComponent ();populatecboAdUsers ();}public void populatecboAdUsers(){List oEmployee = manager. getallememployees ();//oEmployee.Sort();//使用samAccountName的默认比较iccompparer myComparer = new Employee.compareEmployeeByLastName();oEmployee.Sort (myComparer.Compare);foreach (var x in oEmployee){cboAdUsers.Items.Add (x.lastname);Console.WriteLine (x.lastname);}}//结束Form1:表单类//下面的新类使用系统;使用System.Collections.Generic;使用来;使用text;使用System.Collections;名称空间ActiveDirectory{public类Employee:IComparable{公共类compareEmployeeByLastName: IComparer{int IComparer。比较(对象x,对象y){Employee emp1 = (Employee)x;雇员emp2 =(雇员)y;返回String.Compare (emp1。姓,emp2.lastname);}}//默认排序顺序public int CompareTo(对象oEmployee){Employee emp1 = (Employee)oEmployee;返回String.Compare(这一点。samAccountName emp1.samAccountName);}公共字符串firstName{得到;设置;}公共字符串lastName{得到;设置;}公共字符串{得到;设置;}公共弦乐部{得到;设置;}公共字符串distinguishedName{得到;设置;}公共字符串employeeID{得到;设置;}samAccountName{得到;设置;}公共字符串邮箱{得到;设置;}公共字符串标题{得到;设置;}public UserPrincipalExtension{得到;设置;}}}