这是我第一次使用收藏品而且我被困在这里,我做了一个测试项目来检查它,我遇到了一个问题,我不知道如何解决。
首先,我想要做的特别是列表(不能使用其他任何东西),是有一个包含整数列表的主列表,如下所示:
List<List<int>> Allnums = new List<List<int>>();
我想在此处收集我想要添加到上一个列表中的数字:
List<int> nums = new List<int>();
到目前为止,非常好。
我需要无限次地添加列表(nums)到我的主要列表(Allnums),所以我不能创建nums1,nums2,num3 ......等等
好的,让我们尝试在nums中添加一个随机数:(现在只有1个数字)
Random rnd = new Random();
private void button1_Click(object sender, EventArgs e)
{
nums.Add(rnd.Next(10));
}
现在,让我们保存已生成的号码并清除号码列表,以便下次存储新的号码(仅限Lets store 4列表)。
private void button2_Click(object sender, EventArgs e)
{
Allnums.Add(nums); //adds the minor list to the major list.
nums.Clear(); //clears the minor list to accept new values.
}
让我们用以下代码检查结果:
private void button3_Click(object sender, EventArgs e)
{
listBox1.Items.Clear();
listBox1.Items.Add("Number of lists entered: " + Allnums.Count);
foreach (List<int> numList in Allnums)
{
listBox1.Items.Add("----------"); //separator to divide the lists
foreach(int number in numList)
{
listBox1.Items.Add(number);
}
}
}
我明白了:
Number of lists entered: 4 //OK
---------- //List1: nothing
---------- //List2: nothing
---------- //List3: nothing
---------- //List4: nothing
如您所见,生成的所有数字都不在那里。 但如果我删除'nums.Clear();'在'button2_Click'事件中,我明白了:
Number of lists entered: 4 //OK
---------- //List1
0
5
9
1
----------//List2
0
5
9
1
----------//List3
0
5
9
1
----------//List4
0
5
9
1
//All wrong
它存储了所有值,但方式错误,因为我想要实现的是:
Number of lists entered: 4
----------//List1
0
----------//List2
5
----------//List3
9
----------//List4
1
我错了吗?我还需要做别的吗?请帮助,谢谢你的阅读。
答案 0 :(得分:1)
编辑:正如@crashmstr所说,List
是一种引用类型。更好的解决方案是:
AllNums.Add(nums);
nums = new List<List<int>>();
=============================================== ======
在button2_Click
功能中,您需要先创建nums
的副本,然后再将其添加到Allnums。像这样的东西可以解决这个问题:
var newNums = nums.ToArray().ToList();
Allnums.Add(newNums);
答案 1 :(得分:1)
执行Allnums.Add(nums);
后,您有两个nums
引用:一个在Allnums
内,一个在nums
内。当您将nums
四次添加到Allnums
时,您有5个引用指向同一个列表!
您必须创建新列表,我建议使用以下解决方案之一:
Allnums.Add(new List<int>(nums))
或
Allnums.Add(nums);
nums = new List<int>();
在button2_Click
方法中。