c# - 如何使用 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)
{
}
}
解决方案
- 如果结果小于 0,则第一个参数小于第二个,
- 如果结果为 0,则参数的顺序相同,
- 否则,第二个小于第一个
因此,如果您不需要订购相同的商品LastName
,您可以FirstName
使用默认字符串比较进行比较:
public sealed class NameComparer : IComparer<Name>
{
public int Compare(Name x, Name y)
{
return x.FirstName.CompareTo(y.FirstName);
}
}
推荐阅读
- python - python中数字模式的最佳方法是什么?
- css - scss 滚动行为:平滑;单击链接时无法在任何浏览器上运行
- python - 使用 if else 条件 Python 查找大数
- vba - Powerpoint VBA 显示已退出幻灯片的形状(在特定形状范围内)
- javascript - 绑定来自 {@html} 指令的苗条元素
- kubernetes - 带有 HTTP LoadBalancer 的 Google Cloud Kubernetes
- linux-kernel - 通过内核模块替换写入系统调用中的按键
- javascript - 有没有办法在显示标签时修改标签内的变量?
- ios - xcode 构建到 iPhone 设备它具有无效的代码签名
- makefile - 在 Makefile 中打印所有正在进行的目标