【问题标题】:C# overriding old objects in a loop [closed]C#在循环中覆盖旧对象[关闭]
【发布时间】:2012-08-21 13:47:34
【问题描述】:

我有一个循环存储创建对象和存储它们。有 3 个类和很多代码,所以我将重点介绍: 在主类中:

 public static List<TaskIDHolder> mainHolders = new List<TaskIDHolder> ();

我的循环是这样工作的:

 foreach (string aDir in directories){
 //Variables
 string var1= "";
 int var2= 0;

 //Buisness Logic


 //Storage
        Boolean newTaskID = true;
        foreach (TaskIDHolder taskIDHolder in mainHolders)
        {
            if (taskIDHolder.getTaskID().Equals(taskID))
            {
                //Add obj
                File newFile = new File(var1, var2);
                taskIDHolder.addFile(newFile);
                newTaskID = false;
            }
        }
        if (newTaskID)
        {
            //Create Holder
            File newFile = new File(var1, var2);
            TaskIDHolder newHolder = new TaskIDHolder(taskID, newFile);
            //Add Holder
            mainHolders.Add(newHolder);
        }    

 }

现在我的其他类是 File 和 TaskIDHolder。现在我在 TaskIDHolder 中获得了同一文件的 9 个实例,而不是不同的实例。

编辑:抱歉,我的问题是如何获取存储的 File 对象的唯一实例。

我没有写下业务逻辑,因为它没有为问题带来洞察力。

至于这里的类是:

class File
{
    public static string var1;
    public static int var2;

    public File(string avar1, int avar2)
    {
        var1 = avar1;
        var2 = avar2;
    }

    public string getVar1()
    {
        return var1;
    }

    public int getVar2()
    {
        return var2;
    }
}

class TaskIDHolder
{
    public static List<File> files = null;
    public static string taskID = "";

    public TaskIDHolder(string aTaskID, File aFile)
    {
        taskID = aTaskID;
        files = new List<File>();
        files.Add(aFile);
    }

    public void addFile(File aFile)
    {
        files.Add(aFile);
    }

    public string getTaskID()
    {
        return taskID;
    }

    public List<File> getFiles()
    {
        return files;
    }
}

【问题讨论】:

  • 这对我来说听起来不对 - 我强烈建议您编写一个简短但 完整 的程序来演示该问题。目前我们看不到您的 File 或 TaskIDHolder 类。
  • 您正在为每个目录循环访问相同的列表 (mainHolders)。这是你想要的吗?
  • var1 和 var2 是干什么用的?你永远不会改变它们。
  • “taskID”从何而来?
  • 我认为你需要在设置 newTaskID = false 后打破内部 foreach 循环;

标签: c# memory loops


【解决方案1】:

可能要求类似(伪代码):

 if (newTaskID)
 {
   //find a file in the collection
   File newFile = taskIDHolder.Where(file=>file.Var1 == var1 && file.Var2==var2).SingleOrDefault<File>();

   //can not find it, so create a new one
   if(newFile==null)
       newFile = new File(var1, var2);

   TaskIDHolder newHolder = new TaskIDHolder(taskID, newFile);
   //Add Holder
   mainHolders.Add(newHolder);
  }    

请注意,我假设 File 对象具有 Var1Var2 属性。如果没有,请为您的类型选择正确的属性。

【讨论】:

  • 您需要将Single 替换为SingleOrDefault,否则如果没有,您将得到一个异常
  • 我不是在问这个,我是在问为什么我的文件对象变量都被覆盖到我的文件的最后一个实例。
  • @AmiramKorach:哎呀,纠正了,谢谢。
  • @PeterP:原因,可能(很难从代码中扣除),但 vasr1var2 是引用类型变量,而您 在每个新的File 对象创建时重新创建它们,因此所有Files 都指向相同的var1var2
  • 我同意 Tigran,但是为什么循环中没有创建 var1 和 var2 的新实例。
猜你喜欢
  • 2021-03-28
  • 1970-01-01
  • 2020-04-17
  • 1970-01-01
  • 1970-01-01
  • 2013-02-08
  • 2017-02-26
  • 1970-01-01
  • 2020-02-27
相关资源
最近更新 更多