You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何创建泛型函数getById<T>,实现类的List<T>成员按ID查找

优化带Id属性类的通用查找方法

问题场景

当多个自定义类都包含int Id属性,且需要在持有这些类集合的容器类中按Id查找元素时,会出现大量仅类型不同的重复查找代码,示例如下:

public class ClassA
{
    public int Id { get; set; }
}

public class ClassB
{
    public int Id { get; set; }
}

public class MainClass
{
    public List<ClassA> As = new List<ClassA>();
    public List<ClassB> Bs = new List<ClassB>();
    
    public ClassA GetClassAById(int id)
    {
        foreach (var classA in As)
        {
            if (classA.Id == id)
            {
                return classA;
            }
        }
        return null;
    }
    
    public ClassB GetClassBById(int id)
    {
        foreach (var classB in Bs)
        {
            if (classB.Id == id)
            {
                return classB;
            }
        }
        return null;
    }
}

优化方案

通过定义统一接口约束+泛型方法的方式,可以彻底消除重复代码,实现通用的按Id查找逻辑:

1. 定义带Id属性的统一接口

先创建一个接口,约束所有需要按Id查找的类必须实现Id属性:

public interface IHasId
{
    int Id { get; }
}

2. 改造自定义类实现接口

让所有带Id的类实现上述接口:

public class ClassA : IHasId
{
    public int Id { get; set; }
}

public class ClassB : IHasId
{
    public int Id { get; set; }
}

3. 实现通用泛型查找方法

在MainClass中添加一个泛型方法,只要传入的集合元素实现了IHasId接口,就能复用查找逻辑:

public class MainClass
{
    public List<ClassA> As = new List<ClassA>();
    public List<ClassB> Bs = new List<ClassB>();

    // 通用按Id查找方法
    public T GetElementById<T>(List<T> collection, int id) where T : IHasId
    {
        // 基础foreach实现
        foreach (var item in collection)
        {
            if (item.Id == id)
            {
                return item;
            }
        }
        return default;

        // 或用LINQ简化(需引用System.Linq)
        // return collection.FirstOrDefault(item => item.Id == id);
    }

    // 可选:保留原有方法签名,内部调用通用方法(兼容旧代码)
    public ClassA GetClassAById(int id) => GetElementById(As, id);
    public ClassB GetClassBById(int id) => GetElementById(Bs, id);
}

方案优势

  • 消除重复代码:所有实现IHasId的类都能复用同一个查找逻辑,后续新增带Id的类,只需实现接口即可,无需再写新的查找方法。
  • 类型安全:通过泛型约束确保传入的类型一定包含Id属性,编译期就能发现错误。
  • 性能优异:相比反射实现,接口约束的方式不会带来额外性能开销。

内容的提问来源于stack exchange,提问作者Tsaras

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 22:07:27