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

Linq请求中Guid值意外变更的原因咨询

问题解析:LINQ延迟执行导致Guid不一致的原因

先拆解代码里的核心问题——LINQ的延迟执行特性:

  • requests变量是一个IEnumerable<TestNewGuid>,它的Select(a => new TestNewGuid())并不会立刻创建TestNewGuid实例,只有当你枚举这个集合(比如调用ToHashSet()、First()、foreach循环等)的时候,才会执行lambda表达式里的new TestNewGuid(),每次枚举都会重新执行这段代码。

代码执行流程:

  1. 执行requests.Select(a => a.RequestId).ToHashSet()时,第一次枚举requests:
    • 触发new TestNewGuid()创建实例,生成一个唯一Guid,取出它的RequestId存入HashSet。
  2. 执行requests.First().RequestId时,第二次枚举requests:
    • 再次触发new TestNewGuid()创建新实例,生成一个全新的Guid,自然和HashSet里的Guid不一致,断言失败。

困惑点解答:

你以为Select(a => a.RequestId)会提前把Guid取出来保存,但实际上这个Select也是延迟执行的,整个链式调用只有在ToHashSet()触发枚举时才会跑通。而每次枚举原始的requests,都会重新创建TestNewGuid实例,不是复制Guid,而是直接新建对象,所以RequestId每次都是新的。

解决办法:

把requests转换成立即执行的集合(比如List或Array),这样实例只会创建一次,后续枚举都是同一个对象:

var requests = toInitAnEnumerable
    .Select(a => new TestNewGuid())
    .ToList(); // 立即执行创建实例,存储在列表中

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 20:42:13