是否可以保留C#中List的先前值

时间:2012-11-25 23:09:58

标签: c# list

以下是我的示例代码:

private void button1_Click(object sender, EventArgs e)
    {
        listBox1.Items.Clear();
        foreach (var i in numbers())
        {
            listBox1.Items.Add(i);
        }
    }

    private List<int> numbers()
    {
        List<int> counts = new List<int>();
        for (int i = 1; i <= 5; i++)
        {
            counts.Add(i);
        }
        return counts;
    }

我想知道是否有可能不会覆盖并保留List<>中的先前值。在我的示例中,如果单击按钮,它将在列表框中填充1,2,3,4,5,当我再次单击该按钮时,我预计输出为1,2,3,4,5,1,2, 3,4,5这个值是我期待的List<>我怎么可能这样做?顺便说一下,列表框仅用于显示目的。谢谢!

4 个答案:

答案 0 :(得分:3)

您只需删除listBox1.Items.Clear();

除此之外,您可以使用Enumerable.Concat追加项目:

var num1 = numbers();
var num2 = numbers();
foreach(var num in num1.Concat(num2))
{
    //  ...
}

或者从一开始就使用Enumerable.Range,假设您总是想要添加相同的5个项目:

int currentCount = listBox1.Items.Count;
int groupSize = 5;
var allItems = Enumerable.Range(0, currentCount + groupSize)
                         .Select(i => 1 + i % groupSize);
foreach(var item in allItems)
{
    // ...
}

答案 1 :(得分:1)

Clear删除列表中的所有项目。如果您只想将新列表中的所有项目附加到旧列表,请使用AddRange

 listBox1.Items.AddRange(numbers());

答案 2 :(得分:1)

在类级别声明在numbers()方法之外的计数。每次调用此方法都会将1,2,3,4,5添加到列表中。

private List<int> _counts = new List<int>();

private void button1_Click(object sender, EventArgs e)
{
    listBox1.Items.Clear();
    foreach (var i in numbers())
    {
        listBox1.Items.Add(i);
    }
}

private List<int> numbers()
{
    for (int i = 1; i <= 5; i++)
    {
        _counts.Add(i);
    }
    return counts;
}

答案 3 :(得分:1)

使用List<int> counts = new List<int>();,您可以创建一个新的空列表。每次调用numbers()都会重新发生这种情况。

如果我正确理解您的问题,您希望numbers()将五个数字添加到现有列表中,因此每次调用numbers()时都会增加。

为了实现这一目标,请不要在每次调用List<int>时创建一个新的numbers()作为结果值返回;而是为该列表创建一个私有字段,并在每次调用numbers()时修改它:

private List<int> counts = new List<int>();

private List<int> numbers()
{
    for (int i = 1; i <= 5; i++)
    {
        counts.Add(i);
    }
    return counts;
}

请注意,numbers()仍将返回列表,但它不是新列表;它每次都是相同的列表实例。