【问题标题】:C# - Items inside a list changing when temp value used to add items changesC# - 当用于添加项目的临时值发生变化时,列表中的项目发生变化
【发布时间】:2018-04-07 22:30:02
【问题描述】:

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

例如,如果我正在制作水果列表,并输入 te list 'banana'、'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);
}

“TextNumbers”类是:

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

【问题讨论】:

  • 这是一个常见错误。在循环内移动 temp 变量的声明和初始化。您当前的代码在每个循环中更改相同的对象实例,最后您只看到最后一次更改
  • 是的 - 每次都是相同的温度 - 每次都制作一个新的
  • @Steve 谢谢,您的建议有效,我不知道这是一个如此简单的解决方案。
  • 是的,但是您确实应该尝试了解引用的工作原理,否则此类错误将非常频繁。
  • 尝试:temp = new TextNumbers();然后 inputTextChars.Add(temp);

标签: c# list loops


【解决方案1】:

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

是的,引用类型列表实际上只是引用列表

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-17
    • 1970-01-01
    • 1970-01-01
    • 2017-01-09
    • 1970-01-01
    相关资源
    最近更新 更多