【问题标题】:How to implement IComparer in C# for an interface [closed]如何在 C# 中为接口实现 IComparer [关闭]
【发布时间】:2013-05-10 21:18:15
【问题描述】:

我有一个名为IEmployee 的接口。我需要实现 IComparer 来实现我的接口。

这是我的代码,

interface IEmployee
  {

      String Name {get;set;}
      DateTime DOB {get;set;}
  }

我为此创建了一个子类

class Employee
  {

      String Name {get;set;}
      DateTime DOB {get;set;}
  }

现在我需要为此实现 IComparer,并且在我的 Main 中我想获得类似的 copmarer

IComparer<IEmployee> comparerobject= // The comparer from the class.

使用这个comparer 我需要根据他们的名字对employee 的集合进行排序,比如

var employees = new IEmployee[]{new Employee("....."),....}
Array.Sort<IEmployee>(employees , comparer);

【问题讨论】:

  • 看在 的份上,请不要在你的课程前加上 'c'
  • @Anonymous,大概这行Please help me to doi this
  • IComparer problem的可能重复
  • 关于否决票,读者可能希望您解释您的尝试。我个人没有 -1。

标签: c# icomparer


【解决方案1】:

您可以改为实现IComparable。然后你的代码可能看起来像:

interface IEmployee : IComparable
{
    String Name { get; set; }
    DateTime DOB { get; set; }
}

class Employee : IEmployee
{
    public string Name { get; set; }
    public DateTime DOB { get; set; }

    public int CompareTo(object obj)
    {
        return this.Name.CompareTo(((IEmployee)obj).Name);
    }
}

然后您可以按如下方式对数组进行排序:

Array.Sort<IEmployee>(employees);

【讨论】:

  • 我认为你的意思是“你可以让你的 [class] 实现 IComparable”(即不是“接口”)。
  • @J0e3gan 是的,我应该更仔细地措辞。该类将包含实现,但是如果接口的实现需要您还实现另一个接口(如我上面的回答),您将如何解释它?
  • 不用担心 - 只是想帮助澄清一个好的答案。我想我会说“你可以定义一个适当的接口来继承IComparable - 例如IEmployee - 然后让你的类实现它。”
  • 有趣的是,即使是关于 C# 接口的 MSDN 文档在这方面也有混乱的语言 - 在 VS-2008-era documentation 中使用“继承”(“接口可以继承其他接口。”)和VS-2012-era documentation 中的“实现”(“接口可以实现其他接口。”)关于像您在IComparableIEmployee 之间概述的接口之间的关系。有时我们只是无法克服语言固有的歧义。 :}
【解决方案2】:

你可以的

var sorted = employees.OrderBy(e => e.Name).ToArray();

或使用比较器

public class EmployeeComparer : IComparer<IEmployee>
    {
        public int Compare(IEmployee x, IEmployee y)
        {
            return x.Name.CompareTo(y.Name);
        }
    }

然后Array.Sort(employees, new EmployeeComparer());

【讨论】:

  • 就可读性而言,这是执行此操作的最佳方法 - 但它的效率略低,因为它会在返回最终数组之前创建一个额外的 IEnumerable&lt;IEmployee&gt; 和动态调整大小的数组...
  • @Keith Nicholas :我知道这种方式。但我需要实现接口来获取比较器。
  • 给你一个比较器.....
【解决方案3】:

您是否有理由要使用IComparer?除此之外,您还有几个选择。

首先,您可以使用 @Keith 描述的 Linq 查询。由于必须分配新的IEnumerable,因此这会影响内存。

也许您最好的选择是使用Sort 方法的重载,该方法接收Comparison 对象,该对象只是比较两个对象的委托:

Array.Sort(employees, (a, b) => a.Name.CompareTo(b.Name));

如果你真的要使用IComparer,那么你需要制作一个实现IComparer&lt;IEmployee&gt;的类:

public class EmployeeComparer : IComparer<IEmployee>
{
    public int Compare(IEmployee e1, IEmployee e2)
    {
        return e1.Name.CompareTo(e2.Name);
    }
}

然后将其用于Sort 方法。如果你愿意,你也可以让Employee 本身实现IComparer,但这很奇怪,从那时起它真的可以实现IComparable

【讨论】:

    猜你喜欢
    • 2021-01-23
    • 1970-01-01
    • 1970-01-01
    • 2014-01-18
    • 2021-12-05
    • 2020-04-30
    • 1970-01-01
    • 2013-08-15
    • 1970-01-01
    相关资源
    最近更新 更多