【问题标题】:How to implement a custom sort using IComparer<T> in C# [duplicate]如何在 C# 中使用 IComparer<T> 实现自定义排序 [重复]
【发布时间】:2020-09-14 18:12:12
【问题描述】:

我有一个如下所示的名称列表,我想通过实现IComparer&lt;T&gt; 来实现自定义排序。此自定义排序必须检查两个项目的名字,如果它们相同,则应将它们放在一起。因此,例如,最终结果将是

John       Locke
John       Doe
Elizabeth  Davis
Elizabeth  Hurley
Ashley     Williams

我不想按 FirstName 对列表进行排序,我只想将 FirstName 相似但 LastName 不同的那些放在一起。

class Program
{
    static void Main(string[] args)
    {
        List<Name> names = new List<Name>
        {
            new Name {FirstName = "John", LastName = "Locke"},
            new Name {FirstName = "Elizabeth", LastName = "Davis"},
            new Name {FirstName = "John", LastName = "Doe"},
            new Name {FirstName = "Ashley", LastName = "Williams"},
            new Name {FirstName = "Elizabeth", LastName = "Hurley"}
        };

        foreach (Name name in names)
        {
            Console.WriteLine($"{name.FirstName, -10} {name.LastName, -10}");
        }

        Console.WriteLine("\n\n");

        List<Name> sorted = names.OrderBy(o => o, new NameComparer()).ToList();

        foreach (Name name in sorted)
        {
            Console.WriteLine($"{name.FirstName,-10} {name.LastName,-10}");
        }

        Console.ReadKey();
    }
}

public sealed class Name
{
    public string FirstName { get; set; }

    public string LastName { get; set; }
}

public sealed class NameComparer : IComparer<Name>
{
    public int Compare(Name x, Name y)
    {
    }
}

【问题讨论】:

  • 这段代码有什么问题?
  • @PavelAnikhouski 我不知道如何在 Compare() 中实际做到这一点。
  • 简单的names.OrderBy(x =&gt; x.FirstName).ThenBy(x =&gt; x.LastName).ToList();有什么问题?
  • @Vahid,对不起,我显然不明白你所说的“聚集在一起”是什么意思。请澄清。
  • @Vahid,再次打开问题,我已经用IComparer&lt;T&gt; 完成了:)

标签: c# sorting icomparer


【解决方案1】:

As per documentation

  • 如果结果小于 0,则第一个参数小于第二个,
  • 如果结果为0,则参数顺序相同,
  • 否则,第二个小于第一个

因此,如果您不需要订购具有相同LastName 的商品,您可以使用默认字符串比较来比较FirstName

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

【讨论】:

    【解决方案2】:

    根据您的要求,对名字进行简单的字典排序就足够了:

    public sealed class NameComparer : IComparer<Name>
    {
        public int Compare(Name x, Name y) => x.FirstName.CompareTo(y.FirstName);
    }
    

    【讨论】:

    • 嗨,Blindy,我不想打乱列表的总体顺序,只需将名字相同的人拉近即可。
    • @Vahid 我的朋友,这个“聚集”/“拉近”让每个人都感到困惑。特别是因为您的问题标题询问“排序”。根据定义,排序是顺序的变化。
    • @GeorgeKerwood 我同意,我找不到合适的措辞。
    • @GeorgeKerwood 我的想法是该列表首先有一个顺序,我想以一种将具有相似名字的项目聚集在一起的方式对其进行排序。
    • “我想以将具有相似名字的项目聚集在一起的方式对其进行排序。”到目前为止,这正是这两个答案给你的,也是你最有可能得到的,直到有人因为格式错误而关闭你的问题,不管你是否投反对票。
    猜你喜欢
    • 2020-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-24
    • 2010-11-02
    • 2012-12-22
    • 2021-09-28
    相关资源
    最近更新 更多