我想在我的数据采集应用程序中使用嵌套列表来动态存储传入的16位数据。我创建了一个UInt16列表,并将其添加三次(NUMCHANNEL = 3)到List类型列表。现在我希望我可以按照代码显示的方式添加Uint16条目:
public List<UInt16> TBATT16 = new List<UInt16>();
public List<List<UInt16>> LBATT16 = new List<List<UInt16>>();
for (int i = 0; i < NUMCHANNEL; ++i)
{
LBATT16.Add(TBATT16);
}
LBATT16[0].Add((ushort)(0x1155));
它确实添加了一个条目,但不仅是LBATT16 [0],还包括所有LBATT16列表。我在这里做错了什么?
答案 0 :(得分:3)
您需要在循环中移动列表:
public List<List<UInt16>> LBATT16 = new List<List<UInt16>>();
for (int i = 0; i < NUMCHANNEL; ++i)
{
//Make a unique list for each element
public List<UInt16> TBATT16 = new List<UInt16>();
LBATT16.Add(TBATT16);
}
LBATT16[0].Add((ushort)(0x1155));
答案 1 :(得分:2)
因为你只有一个TBATT16
- 这是一个引用类型,这意味着在你的for
循环中你实际上并没有每次添加新的空列表,你只是添加了相同的列表一遍又一遍地。然后你选择哪个参考并不重要 - 你总是得到相同的内部列表。
使用TBATT16
替换循环体中的new List<UInt16>()
,它将按预期工作。
有关C#中引用的详细信息,请参阅示例this article。
答案 2 :(得分:0)
List是一种引用类型 - 因此您在LBATT16列表中拥有相同的对象3次。