Linq请求中Guid值意外变更的原因咨询
问题解析:LINQ延迟执行导致Guid不一致的原因
先拆解代码里的核心问题——LINQ的延迟执行特性:
requests变量是一个IEnumerable<TestNewGuid>,它的Select(a => new TestNewGuid())并不会立刻创建TestNewGuid实例,只有当你枚举这个集合(比如调用ToHashSet()、First()、foreach循环等)的时候,才会执行lambda表达式里的new TestNewGuid(),每次枚举都会重新执行这段代码。
代码执行流程:
- 执行
requests.Select(a => a.RequestId).ToHashSet()时,第一次枚举requests:- 触发
new TestNewGuid()创建实例,生成一个唯一Guid,取出它的RequestId存入HashSet。
- 触发
- 执行
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
相关产品推荐
相关产品推荐

