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

C# Visual Studio中如何向LinkedList添加不被覆盖的元素?

解决LinkedList添加同一对象导致所有元素值相同的问题

嘿,这个问题我太熟了——这是C#引用类型特性带来的经典“坑”!我来给你拆解原因和解决方案:

问题根源

你创建的temp是引用类型(比如自定义类),在C#里,引用类型变量存储的是对象在内存中的地址,而不是对象本身。当你反复修改temp的属性时,其实都是在修改同一个内存地址里的对象内容;每次调用data.AddLast(temp),只是把这个内存地址(引用)添加到链表中,并没有复制整个对象。所以最终链表的所有元素都指向同一个temp对象,自然全是它的最终属性值。

解决方案

核心思路就是:每次添加到链表前,创建一个新的T类型对象实例,而不是复用同一个temp。下面给你几种具体实现方式:

1. 循环内每次新建对象(最直接的方式)

把temp的创建放到循环或每次赋值的逻辑内部,确保每次添加的都是全新的对象:

LinkedList<YourCustomType> data = new LinkedList<YourCustomType>();

// 示例:假设你在循环中生成不同属性的对象
for (int i = 0; i < 5; i++)
{
    // 每次循环都新建一个T类型对象
    YourCustomType temp = new YourCustomType();
    temp.Property1 = $"Value {i}";
    temp.Property2 = i * 10;
    data.AddLast(temp);
}

这样链表中的每个元素都是独立的对象,修改各自属性不会互相影响。

2. 封装对象创建逻辑(复用性更强)

如果创建对象的逻辑比较复杂,可以封装成一个工厂方法,每次调用都返回新实例:

// 定义工厂方法,返回新的T类型对象
private static YourCustomType CreateNewCustomType(string prop1, int prop2)
{
    return new YourCustomType
    {
        Property1 = prop1,
        Property2 = prop2
    };
}

// 使用方法
LinkedList<YourCustomType> data = new LinkedList<YourCustomType>();
data.AddLast(CreateNewCustomType("First Value", 10));
data.AddLast(CreateNewCustomType("Second Value", 20));
// ... 后续添加逻辑

额外说明

  • 如果你的T是值类型(比如int、自定义struct),不会出现这个问题——因为值类型变量存储的是实际数据,每次修改都会生成新的副本。但显然你这里的T是引用类型(类)。
  • 如果T是不可变类型(比如string、DateTime),修改属性本质是创建新对象,也不会有这个问题,但自定义业务类一般是可变的,所以还是要回到“每次新建实例”的思路上。

这样调整后,你的LinkedList<T>就能存储不同属性值的独立对象,完全符合你的预期啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:13:36