如何为C# List列表中的重复对象分配唯一的uniquid属性值
问题根因
你遇到的重复ID问题本质是C#引用类型的特性导致的:你定义的icons是类(引用类型),如果fullList里存在多个指向同一个内存实例的引用(也就是你说的属性完全相同的重复对象),循环中每次给single.uniquid赋值时,修改的是同一个实例的属性,之前已经存入icons列表的同实例引用的属性值也会被同步覆盖,最终所有指向同一个实例的引用的uniquid都会变成最后一次赋值的Guid,因此出现重复。
解决方案
核心思路是每次循环都创建全新的icons实例,避免修改原实例导致的互相影响:
List<icons> icons = new List<icons>(); foreach (var single in fullList) { // 新建icons实例,拷贝原对象所有属性 var newIcon = new icons() { // 此处补齐icons类除uniquid外的所有原有属性赋值,示例如下 OriginalId = single.OriginalId, IconUrl = single.IconUrl, Size = single.Size, // 给新实例单独生成唯一ID uniquid = Guid.NewGuid() }; icons.Add(newIcon); }
如果icons类属性较多,手动拷贝太繁琐,也可以通过序列化反序列化、AutoMapper映射等方式实现快速深拷贝。
特殊场景说明
如果你必须保留原fullList里的实例不做拷贝,需要先把所有重复实例拆分后再赋值ID,但这种场景下原实例本身就存在多处引用,修改属性仍然会有全局影响,不推荐使用。
内容的提问来源于stack exchange,提问作者developer
相关产品推荐
相关产品推荐

