互连列表C#

时间:2013-08-24 10:41:10

标签: c# list

我有两个属性的类,它们是列表,其中一个是内容int - 来自第二个List的对象的ID。我覆盖了setter和getters来保存彼此之间的友好关系。但是当我添加一些这个列表时,他们不同步。如何使它们同步?

这是代码

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,如果是这样,我该怎么做?

3 个答案:

答案 0 :(得分: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>

答案 1 :(得分: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) {
        //
    }
}

答案 2 :(得分:1)

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

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

这样,调用者可以使用“操作”列表执行他们需要执行的操作(“添加”,“删除”,“计数”等)。 OperationID现在不是人们可以使用的第二个属性;相反,它只反映Operations属性中的信息。

相关问题