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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 17:01:25