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;
}
}
然后,包装它的代码只是设置变量的方法。
您的循环没有理由覆盖文件。您的代码看起来应该可以工作。
作为测试,您可以尝试以下内容而不是循环:
moduleList.AddRange(files.Select(x=>{
Module newModule = new Module();
newModule.PopulateModule(x);
return newModule;
});
告诉我会发生什么?
编辑:对于未来的访问者,问题是模块类的属性是静态的。这就是每次迭代时覆盖值的原因。