【问题标题】:c# list comparer use two compare elementsc# 列表比较器使用两个比较元素
【发布时间】:2010-03-08 13:12:25
【问题描述】:
private class CompAdvertisements : IComparer<Advertisements>
{
private string OrderBy { get; set; }

public CompAdvertisements(string orderBy)
{
OrderBy = orderBy;
}

#region IComparer<Advertisements> Members

public int Compare(Advertisements x, Advertisements y)
{
return x.Country.Name.CompareTo(y.Country.Name);

我也可以使用 x.Name.CompareTo(y.Name);在比较器中,我将与两个元素进行比较,例如 order by something 和 order by something2

【问题讨论】:

    标签: c#


    【解决方案1】:

    是的。如果外部比较表明您的两个元素 (Country.Name) 相同,则您改为返回内部比较的结果 (somethingElse)。您可以对任意深度的比较进行此操作。

    outerCompare = x.Country.Name.CompareTo(y.Country.Name);
    if (outerCompare != 0)
    {
        return outerCompare;
    }
    else
    {
        return (x.Name.CompareTo(y.Name));
    }
    

    【讨论】:

    • 如果 x 为空怎么办,如何使该元素在使用排序时位于底部或顶部。
    • 如果 x 和 y 在您的代码中远程可行(包括将来重用您的代码的人),您应该检查 x 和 y 是否为空。但是,由于在您的示例中,您只是比较来自相同两个对象的两组属性,如果它们都为 null,则它们相等(返回 0),但如果一个为 null 而一个不为 null,则它们不相等。在这种情况下,如果 x 不为空,则返回 1;如果 y 不为空,则返回 -1。
    • 我的印象是,如果您编写 x.Name.CompareTo(y.Name) 并且 x 或 y 为空,那么您会得到 NullReferenceException。
    • 如果你不检查 x 或 y 是否为空,这就是你得到的。根据您的应用程序,您可能希望允许一个或两个为 null 并检查。
    【解决方案2】:

    Eric J. 是对的。您可能还想看看this stackoverflow question. 那里的答案提供了几种对列表进行排序的方法,它们还详细介绍了使用 IComparer 对象执行与您正在执行的任务类似的任务。

    【讨论】:

      猜你喜欢
      • 2020-07-04
      • 2019-12-07
      • 1970-01-01
      • 2016-07-20
      • 2015-11-06
      • 2014-01-07
      • 1970-01-01
      相关资源
      最近更新 更多