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 防止外部误改