如何在C#中修改List<MemberData>从索引35起的isBlocked字段?
解决方案
因为MemberData是引用类型,直接修改列表元素会同步影响原对象,所以要保留原列表的初始状态,必须为每个元素创建独立副本,再修改指定范围副本的isBlocked字段。
步骤1:为MemberData添加复制构造函数
先给类添加复制构造函数,方便快速创建对象副本:
public class MemberData { public string clientId; public string displayName; public bool isBlocked; // 复制构造函数,用于创建对象副本 public MemberData(MemberData other) { clientId = other.clientId; displayName = other.displayName; isBlocked = other.isBlocked; } }
步骤2:生成处理后的新列表
你可以用两种方式实现,按需选择:
方式一:for循环实现
// 原列表 List<MemberData> storeCustomers = ...; // 你的100个元素的列表 // 初始化新列表 List<MemberData> processedCustomers = new List<MemberData>(storeCustomers.Count); for (int i = 0; i < storeCustomers.Count; i++) { MemberData original = storeCustomers[i]; // 创建原对象的独立副本 MemberData copy = new MemberData(original); // 从索引35开始,将副本的isBlocked设为false if (i >= 35) { copy.isBlocked = false; } processedCustomers.Add(copy); }
方式二:LINQ实现(更简洁)
List<MemberData> processedCustomers = storeCustomers .Select((member, index) => new MemberData(member) { // 索引小于35时保留原isBlocked值,否则设为false isBlocked = index < 35 ? member.isBlocked : false }) .ToList();
关键说明
- 必须创建对象副本:如果直接复用原列表的引用,修改
isBlocked会同时改变原列表中的对象状态——因为引用类型的列表元素存储的是对象的内存地址。 - 原列表
storeCustomers会完全保留初始状态,所有元素的isBlocked依然为true,新列表processedCustomers则是处理后的结果。
内容的提问来源于stack exchange,提问作者neobits
相关产品推荐
相关产品推荐

