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

标签 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 并且项目未从列表中删除。我的代码有什么问题吗?

最佳答案

这是一个时间问题。

您正在从构造函数调用 calculationDone()之前实例可能已经被分配给调用方法中的列表。

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

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

    // DO SOMETHING

    calculationDone();
}

代码中的顺序是:

  • addData()
    • X 的构造函数
      • 计算完成
      • list.Remove(X)//失败,未找到 X
    • 列表.Add(X)

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

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

这将按预期工作。

关于c# - 列表 - 如何通过引用查找项目?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18869611/

相关文章:

c# - 用除括号外的子字符串分割字符串

java - 在Java中对匹配的数组进行排序

非模板类中任意类型的C++成员变量

java - 无法声明类字段

C# Xamarin - Popover segue 导致匿名构建错误

c# - 如何在 asp.net 中停止页面加载时的数据绑定(bind)

list - Haskell - 我如何迭代和比较?

python - 根据字符串所在位置对 map 上的字符串元素进行计数,并用计数填充网格

python - 有没有办法绕过 Python list.append() 随着列表的增长而在循环中逐渐变慢?

c# - 如何让 sitecore 显示图像(或其他资源)