C# - 当用于添加项目的临时值发生变化时,列表中的项目会发生变化

时间:2017-10-26 13:44:09

标签: c# list loops

我一直在尝试使用临时变量和某种循环将多个项添加到列表中。我将在循环外部创建临时变量和列表,然后在循环内部临时变量将更改值,然后在循环重复之前将其作为新元素添加到列表中。问题是,每当更改临时变量时,列表中的所有元素都将变为相同。

例如,如果我正在制作水果列表,并输入了te list' banana' apple' apple'和#梨;'当写入控制台时,列表会读到' pear' pear' pear'和' pear',这也是列表在调试模式下的显示方式。

我输入的具体代码如下:

string inputText = "";
List<TextNumbers> inputTextChars = new List<TextNumbers>();
TextNumbers temp = new TextNumbers();
bool charFound = false;

inputText = Console.ReadLine();

foreach (char letter in inputText)
{
    for (int i = 0; i < inputTextChars.Count; i++)
    {
        if (letter == inputTextChars.ElementAt(i).character)
        {
            charFound = true;
        }
    }

    if (charFound == false)
    {
        temp.character = letter;
        temp.number = 0;
    }

    temp.number++;
    inputTextChars.Add(temp);

    charFound = false;
}

inputTextChars.Sort();

foreach (TextNumbers text in inputTextChars)
{
    Console.WriteLine(text.character + ": " + text.number);
}

课程&#39; TextNumbers&#39;是:

public class TextNumbers
{
    public char character;
    public int number;
}

1 个答案:

答案 0 :(得分:4)

您可以从the accepted answer on this question看到:

  

是的,参考类型列表实际上只是一个参考列表

这意味着您每次都会在列表中添加对temp的引用。

要避免这种情况,请将temp变量的声明移到循环中,以便每次都添加对全新对象的引用,如下所示:

foreach (char letter in inputText)
{
    TextNumbers temp = new TextNumbers();
    //..... rest of code