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;
        }
    }
}

IComparer problem

你需要实现一个名为"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{得到;设置;}}}