C# 列表覆盖

本文关键字:覆盖 列表 | 更新日期: 2023-09-27 18:36:22

我正在尝试为我正在编写的程序创建我在运行时创建的新对象列表。

public class User //This is a datastructure to hold all modules as well as any other user data
{
    List<Module> moduleList = new List<Module>(); //list to contain all modules
    public void ImportAllModules() //Imports all files within the module file folder
    {
        List<List<string>> files = noteFile.getAllFiles(noteFile.moduleLoc); //Creates a jagged List of all files and contents within each file
        foreach (List<string> file in files) //For every file it creates a newmodule object
        {
            Module newModule = new Module(); //Creates new object
            newModule.PopulateModule(file); //Fully populates the object from the file
            moduleList.Add(newModule); //Adds the new module object onto the list of modules
        }
    }
}

我发现每次迭代 foreach 循环时,它都会覆盖列表中所有以前的项目。例如,如果我尝试添加 6 个对象,每个对象都会被添加,但随后被下一个循环中的下一个对象覆盖。

程序(此时)将文件夹中的每个文件加载到二维锯齿状列表中,以可视化 x 轴上的每个文件,然后是 y 轴上的每一行文本(每个文件中)。然后,我运行一个 foreach 循环,使用该 2d 交错数组从这些文件中提取有用的数据,并将它们转换为我可以在程序中使用的对象。我将它们存储到一个列表中,以便于组织新对象。

我尝试寻找解决方案,但其他人的问题是他们在循环之外声明对象,而我没有这样做。

感谢您的任何帮助:)

编辑:这是填充模块方法

 public void PopulateModule(List<string> file) //This will do all of the imports from a single file in one handy method
    {
        Code(ImpCode(file));
        Title(ImpTitle(file));
        Synopsis(ImpSynopsis(file));
        LearnObj(ImpLO(file));
        Assignments(ImpAssignment(file));
        Notes(ImpNote(file));
    }

但我认为这本身对你来说不是那么有用,所以以下是它对 ImpCode 的实际作用:

public string ImpCode(List<string> file) //importing learning module code
    {
        try
        {
            return file[file.IndexOf("CODE") + 1];//looks for the section heading in the file, then gets the next line of the file which will have the contents and returns it.
        }
        catch (Exception ex)
        {
            MessageBox.Show(Convert.ToString(ex), "Error"); //Displays the generated error message to the user
            return null;
        }
    }

然后,包装它的代码只是设置变量的方法。

C# 列表覆盖

您的循环没有理由覆盖文件。您的代码看起来应该可以工作。

作为测试,您可以尝试以下内容而不是循环:

moduleList.AddRange(files.Select(x=>{ Module newModule = new Module(); newModule.PopulateModule(x); return newModule; });

告诉我会发生什么?

编辑:对于未来的访问者,问题是模块类的属性是静态的。这就是每次迭代时覆盖值的原因。