【发布时间】:2020-09-14 18:12:12
【问题描述】:
我有一个如下所示的名称列表,我想通过实现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)
{
}
}
【问题讨论】:
-
这段代码有什么问题?
-
@PavelAnikhouski 我不知道如何在 Compare() 中实际做到这一点。
-
简单的
names.OrderBy(x => x.FirstName).ThenBy(x => x.LastName).ToList();有什么问题? -
@Vahid,对不起,我显然不明白你所说的“聚集在一起”是什么意思。请澄清。
-
@Vahid,再次打开问题,我已经用
IComparer<T>完成了:)