C# 如何使用IComparer实现自定义排序<;T>;在C中#

C# 如何使用IComparer实现自定义排序<;T>;在C中#,c#,sorting,icomparer,C#,Sorting,Icomparer,我有一个名称列表,如下所示,我想通过实现IComparer来实现自定义排序。此自定义排序必须检查两个项目的名字,如果它们相同,则应将它们合并在一起。例如,最终的结果是 John Locke John Doe Elizabeth Davis Elizabeth Hurley Ashley Williams 我不想按名字排序,我只想把名字相似但姓氏不同的人放在一起 类程序 { 静态void Main(字符串[]参数) { 列表名称=新列表 { 新名称{First

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

John       Locke
John       Doe
Elizabeth  Davis
Elizabeth  Hurley
Ashley     Williams
我不想按名字排序,我只想把名字相似但姓氏不同的人放在一起

类程序
{
静态void Main(字符串[]参数)
{
列表名称=新列表
{
新名称{FirstName=“John”,LastName=“Locke”},
新名字{FirstName=“伊丽莎白”,LastName=“戴维斯”},
新名称{FirstName=“John”,LastName=“Doe”},
新名称{FirstName=“Ashley”,LastName=“Williams”},
新名称{FirstName=“Elizabeth”,LastName=“Hurley”}
};
foreach(名称中的名称)
{
WriteLine($“{name.FirstName,-10}{name.LastName,-10}”);
}
Console.WriteLine(“\n\n”);
List sorted=names.OrderBy(o=>o,new NameComparer()).ToList();
foreach(已排序的名称)
{
WriteLine($“{name.FirstName,-10}{name.LastName,-10}”);
}
Console.ReadKey();
}
}
公共密封类名
{
公共字符串名{get;set;}
公共字符串LastName{get;set;}
}
公共密封类名称比较程序:IComparer
{
公共整数比较(名称x,名称y)
{
}
}

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

public sealed class NameComparer : IComparer<Name>
{
    public int Compare(Name x, Name y) => x.FirstName.CompareTo(y.FirstName);
}
公共密封类名称比较器:IComparer
{
public int Compare(Name x,Name y)=>x.FirstName.CompareTo(y.FirstName);
}

  • 若结果小于0,则第一个参数小于第二个
  • 如果结果为0,则参数的顺序相同
  • 否则,二比一小
因此,如果您不需要订购具有相同
LastName
的项目,您可以使用默认字符串比较来比较
FirstName

public sealed class NameComparer : IComparer<Name>
{
    public int Compare(Name x, Name y)
    {
        return x.FirstName.CompareTo(y.FirstName);
    }
}
公共密封类名称比较器:IComparer
{
公共整数比较(名称x,名称y)
{
返回x.FirstName.CompareTo(y.FirstName);
}
}

这段代码有什么问题吗?@PavelAnikhouski我不知道如何在Compare()中实际执行。简单的
names.OrderBy(x=>x.FirstName)。ThenBy(x=>x.LastName)。ToList()有什么问题?@Vahid,对不起,我显然不明白你说的“聚在一起”是什么意思。请澄清。@Vahid,再次打开问题,我已经和
IComparer
:)嗨,盲了,我不想打乱列表的一般顺序,只想把名字相同的人拉近一点。@Vahid这个“聚在一起”/“拉近一点”让每个人都感到困惑,我的朋友。特别是因为你的问题标题是关于“排序”的。根据定义,排序是顺序的改变。@GeorgeKerwood我同意,我找不到正确的措辞。@GeorgeKerwood我想的是,列表首先有一个顺序,我想以一种方式排序,将具有相似名字的项目聚集在一起。“我想让名字相似的项目聚集在一起。”这正是迄今为止两个答案给你的答案,也是你最有可能得到的答案,直到有人因为你的问题格式不正确而关闭你的问题,不管你投了反对票。
public sealed class NameComparer : IComparer<Name>
{
    public int Compare(Name x, Name y)
    {
        return x.FirstName.CompareTo(y.FirstName);
    }
}