首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >IComparer问题

IComparer问题
EN

Stack Overflow用户
提问于 2011-08-29 18:20:21
回答 4查看 4K关注 0票数 0

目的:使用我类的属性对多个选项进行排序。我设法使用可比较的samAccountName进行排序,但未能正确实现IComparer。但是要知道我得到了下面指定的一个错误。

错误:未实现接口成员System.Collections.Icomparer

代码语言:javascript
复制
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;
        }
    }
}
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-08-29 18:24:36

您需要为您的sortLastName-class实现IComparer实现一个名为“sortLastName”而不是“IComparer”的方法。

然后您可以使用这个x.Sort过载进行排序。

代码语言:javascript
复制
x.Sort(new sortLastName());

这是您应该使用的实现:

代码语言:javascript
复制
public class sortLastName : IComparer<Employee>
{
    public int Compare(Employee oEmployee, Employee oEmployee2)
    {
        return String.Compare(oEmployee.lastName, oEmployee2.lastName);
    }
}

(请注意,我没有更改名称,因为您不会再看到上下文了,但是sortLastName不是比较者的好名称)

票数 8
EN

Stack Overflow用户

发布于 2011-08-29 18:24:42

我完全不知道您的IComparer实现的目的是什么。

您可能应该实现IComparable<T>,而不是非一般的IComparable,但无论如何。

无论哪种方式,都要将您想要的排序顺序合并到您的CompareTo函数中。例如:

代码语言:javascript
复制
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的实现。

编辑:在重读时,我不确定你是想按一个标准排序,还是按另一个标准排序,还是两者兼而有之。但我会把这个答案留给后人,以防你想把这两种情况都分类。

票数 1
EN

Stack Overflow用户

发布于 2011-08-29 18:30:50

IComparer。比较以两个对象作为参数。您在类sortLastName中不使用该签名。还有一个通用版本,如果这是你想要的界面.

IComparer:http://msdn.microsoft.com/en-us/library/system.collections.icomparer.compare(v=vs.71).aspx

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7234128

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档