0

我有两个属性是列表的类,其中一个内容是 int - 这是来自第二个列表的对象的 ID。我覆盖 setter 和 getter 以使它们彼此一致。但是当我添加一些这个到列表时,它们是不同步的。如何使它们同步?

这是代码

public class Item
    {
    private List<Operation> _operations = new List<Operation>();
    private List<int> _operationsID = new List<int>();

    public List<Operation> operations
    {
        get { return this._operations; }
        set 
        {
            this._operations = value;
            if (value != null)
            {
                foreach (Operation oper in value)
                {
                    this._operationsID.Add(oper.ID);
                }
            }
        }
    }

    public List<int> operationsID
    {
        get { return this._operationsID; }
        set 
        {
            this._operationsID = value;
            if (value != null)
            {
                foreach (int operID in value)
                {
                    this._operations.Add(new Operation(operID));
                }
            }
        }
    }
}

如果是这样,我应该覆盖 List.Add,我该怎么做?

4

3 回答 3

1

Add您必须在调用方法之前清除以前的列表内容:

public List<Operation> operations
{
    get { return this._operations; }
    set 
    {
        this._operations = value;
        if (value != null)
        {
            this._operationsID.Clear();
            foreach (Operation oper in value)
            {
                this._operationsID.Add(oper.ID);
            }
        }
        else
        {
            this._operationsID = null;
        }
    }
}

但老实说,我认为将这些东西放在两个不同的列表中并不是一个好主意。你为什么不使用Dictionary<int, Operation>

于 2013-08-24T10:54:35.143 回答
1

有点不清楚您要做什么,但基本上似乎您需要封装这些列表,以便用户无法直接处理它们(并使它们不同步)。您可以通过不向用户公开列表来做到这一点。基本上,您试图将包含的项目保留给用户,因此每当他们处理您的项目集时,他们将被迫通过此类以及该类公开的功能。那么您唯一的问题是找出要向用户公开的内容以及以何种方式公开。

public class Item {
    private List<Operation> _operations = new List<Operation>();
    private List<int> _operationsID = new List<int>();

    public void addOperation(Operation o) {
        _operations.Add(o);
        _operationsID.Add(getIdentifier(o));
    }

    public void removeOperation(Operation o) {
        _operations.Remove(o);
        _operationsID.Remove(getIdentifier(o));
    }

    public void clear() {
        _operations.clear();
        _operationsID.clear();
    }

    public void findOperationMatching(Foobar foo) {
        //
    }

    private int getIdentifier(Operation id) {
        //
    }
}
于 2013-08-24T13:36:25.817 回答
1

尝试管理两个版本的真相是个坏主意。如果是我,我会公开一个List<Operation>调用者可以添加/删除的,第二个IEnumerable<int>只是公开操作的 ID:

public List<Operation> Operations { get; set; }
public IEnumerable<int> OperationIDs
{
    get
    {
        return Operations.Select(op => op.OperationID);
    }
}

这样,调用者可以使用操作列表来做他们需要做的任何事情(添加、删除、计数等)。OperationIDs 现在不是人们可以使用的第二个属性;相反,它仅反映 Operations 属性中的信息。

于 2013-08-24T13:55:48.340 回答