列表 - 如何通过引用查找项目?

时间:2013-09-18 10:18:41

标签: c# list class

我想做这样的事情:

class BaseClass
{
    private List<MyClass> list;

    private void addData()
    {
        list.Add(new MyClass(this));
    }

    public void removeData(MyClass data)
    {
        list.Remove(data);
    }
}

class MyClass
{
    private BaseClass baseClass;

    public MyClass(BaseClass baseClass)
    {
        this.baseClass = baseClass;

        // DO SOMETHING

        calculationDone();
    }

    private void calculationDone()
    {
        baseClass.removeData(this);
    }
}

我的问题是list.Remove()返回false并且项目未从列表中删除。我的代码出了什么问题?

3 个答案:

答案 0 :(得分:3)

这是一个时间问题。

您正在构造函数中调用calculationDone()之前可以将实例分配给调用方法中的列表。

只有当构造函数(和计算)完成时,才会将项添加到列表中。

public MyClass(BaseClass baseClass)
{
    this.baseClass = baseClass;

    // DO SOMETHING

    calculationDone();
}

代码中的序列是:

  • addData()
    • X的构造函数
      • calculationDone
      • list.Remove(X)//失败,找不到X
    • List.Add(X)

这里的道德不是将对象的所有工作(整个生命周期)都放在构造函数中。拆分构造函数和计算时,它变为:

private void addData()
{
    var temp =new MyClass(this); 
    list.Add(temp);
    temp.DoCalculations();  // includes calculationDone()
}

这将按预期工作。

答案 1 :(得分:0)

因为一个班级中的this与另一个班级中的this不同。

class BaseClass
{
  ....
   list.Add(new MyClass(this)); //new MyClass created and pushed on the list 
  ...
}

MyClass

class MyClass  {
   private void calculationDone()
   {
     baseClass.removeData(this); //this is not inside the list
   }
}

换句话说:您必须在MyClass个对象与BaseClass之间建立关联,这样您才能找到MyClass的正确实例

答案 2 :(得分:0)

调用addData时的事件序列是:

  1. new MyClass(this)被称为
  2. 执行MyClass(baseClass)构造函数
  3. 调用
  4. calculationDone方法
  5. 尝试从基本列表中删除对象
  6. 由于未添加对象,删除失败
  7. 构造函数完成
  8. 该项目已添加到列表中。
  9. 因此,在添加之前,您要从列表中删除MyClass实例。我建议避免构造函数中的任何繁重工作,并将其卸载到Execute(或类似命名的)方法。