首页 > 解决方案 > 如何使用 IComparer 实现自定义排序在 C# 中

问题描述

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

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)
    {
    }
}

标签: c#sortingicomparer

解决方案


根据文档

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

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

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

推荐阅读