在C#中列出内部列表
本文关键字:内部 列表 | 更新日期: 2023-09-27 18:26:13
这是我第一次使用集合,我被困在这里,我做了一个测试项目来检查它,但我遇到了一个我不知道如何解决的问题。
首先,我特别想做的是列表(不能使用其他任何东西),就是有一个包含整数列表的主列表,比如:
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));
}
现在,让我们保存已经生成的数字,并清除数字列表,以便下次存储新的数字(只存储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
我错了吗?我必须做点别的吗?请帮忙,谢谢阅读。
Edit:正如@crashmstr所说,List
是一个引用类型。更好的解决方案是:
AllNums.Add(nums);
nums = new List<List<int>>();
==============================================
在button2_Click
函数中,在将其添加到Allnums之前,需要创建nums
的副本。像这样的东西就可以了:
var newNums = nums.ToArray().ToList();
Allnums.Add(newNums);
执行Allnums.Add(nums);
之后,您的nums
有两个引用:一个在Allnums
中,另一个在您的nums
中。当您将nums
添加到Allnums
四次时,您有5个引用指向同一列表!
你必须创建一个新的列表,我建议其中一个解决方案:
Allnums.Add(new List<int>(nums))
或
Allnums.Add(nums);
nums = new List<int>();
在您的button2_Click
方法中。