当前位置:首页 > C# > 正文

C# List 的 BinarySearch 自定义比较器详解(从零开始掌握自定义排序与高效查找)

在 C# 开发中,List<T> 是最常用的数据集合之一。当我们需要对列表中的元素进行高效查找时,BinarySearch 方法是一个非常强大的工具。但默认情况下,它只能用于已按自然顺序排序的元素(如数字、字符串等)。如果我们要对自定义对象(比如学生、商品、订单等)进行二分查找,就需要使用 自定义比较器

C# List<T> 的 BinarySearch 自定义比较器详解(从零开始掌握自定义排序与高效查找) List 自定义比较器  自定义排序比较 二分查找教程 IComparer 实现示例 第1张

什么是 BinarySearch?

BinarySearch 是一种高效的查找算法,时间复杂度为 O(log n)。但它有一个前提:列表必须已经按照某种顺序排好序。否则,查找结果是不可预测的。

对于基本类型(如 intstring),List<T>.BinarySearch(item) 可以直接使用。但对于自定义类(如 StudentProduct),我们需要告诉 .NET 如何比较两个对象——这就需要用到 IComparer<T> 接口。

第一步:定义一个自定义类

假设我们有一个 Person 类,包含姓名和年龄:

public class Person{    public string Name { get; set; }    public int Age { get; set; }    public Person(string name, int age)    {        Name = name;        Age = age;    }    public override string ToString()    {        return $"{Name} ({Age})";    }}

第二步:实现 IComparer<T> 自定义比较器

我们要按 Age 字段进行排序和查找,因此创建一个比较器:

public class PersonAgeComparer : IComparer<Person>{    public int Compare(Person x, Person y)    {        if (x == null && y == null) return 0;        if (x == null) return -1;        if (y == null) return 1;        // 按年龄升序比较        return x.Age.CompareTo(y.Age);    }}

这个比较器实现了 IComparer<Person> 接口,并重写了 Compare 方法。它会根据 Age 属性进行升序比较。

第三步:使用 BinarySearch 配合自定义比较器

完整示例如下:

using System;using System.Collections.Generic;// ... 上面的 Person 和 PersonAgeComparer 类定义 ...class Program{    static void Main()    {        var people = new List<Person>        {            new Person("Alice", 25),            new Person("Bob", 30),            new Person("Charlie", 20),            new Person("Diana", 35)        };        // 必须先按相同规则排序!        people.Sort(new PersonAgeComparer());        // 创建一个“模板”对象用于查找(只需 Age 匹配)        var searchTarget = new Person("", 30);        // 使用自定义比较器进行二分查找        int index = people.BinarySearch(searchTarget, new PersonAgeComparer());        if (index >= 0)        {            Console.WriteLine($"找到: {people[index]}");        }        else        {            Console.WriteLine("未找到匹配项。");        }    }}

注意:在调用 BinarySearch 之前,必须使用

常见误区与注意事项

  • 未排序就调用 BinarySearch:这是最常见的错误,会导致返回错误索引或负数。
  • 比较器不一致:排序和查找必须使用同一个比较逻辑(或行为一致的比较器)。
  • 查找对象不需要完整数据:如上例中,searchTargetName 可以为空,因为我们只按 Age 比较。

SEO 关键词回顾

本文深入讲解了 C# List BinarySearch 自定义比较器 的使用方法,涵盖 C# 自定义排序比较List<T> 二分查找教程 以及 C# IComparer 实现示例。无论你是初学者还是进阶开发者,掌握这些技巧都能让你的代码更高效、更专业。

通过实现 IComparer<T>,你可以轻松地对任何自定义对象进行排序和二分查找,大幅提升程序性能。赶快在你的项目中试试吧!