netcore FirstOrDefault 性能问题

var result = entities.FirstOrDefault(e => e.Id == requestedId);

看起来没问题,对吧?语法正确,逻辑清晰。但背后的问题是:每次调用 FirstOrDefault,系统都要从头到尾把整个列表扫一遍。也就是说:查一次:时间复杂度是 O(n)查 100 次?那就是 O(100n)如果这代码在 API 接口里被频繁调用……那服务器压力很快就上来了更惨的是,很多团队直到上线前压测才发现性能瓶颈,甚至等到生产环境报警了,才顺藤摸瓜找到这些“不起眼”的 FirstOrDefault。而且这类代码往往藏在循环里、服务调用中、或者嵌套逻辑深处,平时根本注意不到,一出事就是大问题。

❌ 不推荐写法:用 List + FirstOrDefault

public class MyService
{
    public List<EntityBase> Entities { get; } = new();

    public EntityBase? GetById(Guid id)
        => Entities.FirstOrDefault(e => e.Id == id);
}

✅ 推荐写法:用 Dictionary 做映射

public class MyService
{
    private readonly Dictionary<Guid, EntityBase> entityLookup;

    public MyService(IEnumerable<EntityBase> entities)
    {
        entityLookup = entities.ToDictionary(e => e.Id);
    }

    public EntityBase? GetById(Guid id)
        => entityLookup.TryGetValue(id, outvar entity) ? entity : null;
}

这么一改,好处立马体现:

✅ 查找速度飞起:从 O(n) 变成 O(1),常数时间搞定

✅ 语义更清楚:一看就知道这是“根据 ID 找对象”,不是随便遍历

✅ 代码更干净:不用到处写 FirstOrDefault,减少重复代码

✅ 还能加安全锁:用 IReadOnlyDictionary 防止外部误改


作者:spike

分类: Net

创作时间:2025-10-19

更新时间:2025-10-22

联系方式放在中括号之中例如[[email protected]],回复评论在开头加上标号例如:#1