维护列表顺序的删除和添加元素

沼泽

我在想出这个问题的逻辑时遇到了麻烦。我有一个窗口中显示的项目列表。如果列表中有项目,则会显示该项目。我没有办法改变这一点。我正在通过可以编辑的继承类访问列表。我无法以任何方式(包含列表的类)编辑基类的源代码。我正在编辑的类是插入列表中的类。它也有权访问该列表。

我需要能够从列表中删除项目并在保持相同顺序的同时插入它们。

例如,如果我的列表是:

1,2,3,4,5

我删除2,3,4然后

1,5

但是,然后我依次添加了4,3,2。它必须显示

1,2,3,4,5 

再次而不是

1,4,3,2,5

它们必须按照删除时的原始顺序进行。这只是一个示例,无法对这些值进行排序。它们按添加顺序排列。

所以问题是,如何删除元素并将其添加到列表中并确保保持顺序?

我试过了:

插入空值,而不是从列表中删除元素。由于显示空白点,因此无法使用。我还尝试过记住它们被删除的索引,但是当我将它们重新插入列表时,可能会在索引0处插入多个项目,并且由于列表缩小而失去了排序。

我正在使用ObservableCollection http://msdn.microsoft.com/zh-cn/library/ms668604(v=vs.110).aspx

我希望这篇文章清楚说明我要达到的目标。

谜团

这是给你的一个主意。我实现了自己的IList<T>课程,该课程可以满足您的需求(我认为)。

首先,我从这里开始:

public class RememberOrderList<T> : IList<T>
{
}

然后,我通过传递给,创建了一个_inner列表,T并实现了大多数必需的方法_inner

public class RememberOrderList<T> : IList<T>
{
    private List<T> _inner = new List<T>();
    public int IndexOf(T item) { return _inner.IndexOf(item); }
    public void RemoveAt(int index) { _inner.RemoveAt(index); }
    public T this[int index] { get { return _inner[index]; } set { _inner[index] = value; } }
    public void Clear() { _inner.Clear(); }
    public bool Contains(T item) { return _inner.Contains(item); }
    public void CopyTo(T[] array, int arrayIndex) { _inner.CopyTo(array, arrayIndex); }
    public int Count { get { return _inner.Count; } }
    public bool IsReadOnly { get { return ((ICollection<T>)_inner).IsReadOnly; } }
    public bool Remove(T item) { return _inner.Remove(item); }
    public IEnumerator<T> GetEnumerator() { return _inner.GetEnumerator(); }
    IEnumerator IEnumerable.GetEnumerator() { return _inner.GetEnumerator(); }

现在,有两种方法可以将项目添加到列表中- InsertAdd

Insert这是一个问题,因为它指定了索引,但我们不希望这样-这样会抛出一个NotSupportedException

    public void Insert(int index, T item)
    {
        throw new NotSupportedException();
    }

Add只需记住添加项目时的顺序,并在退出前进行排序即可。这需要更多的工作。

为了跟踪项目的顺序,我使用Dictionary<T, int>

    private readonly Dictionary<T, int> _order = new Dictionary<T, int>();

并排序List<T>您需要一个IComparer<T>

    private class OrderComparer : IComparer<T>
    {
        private readonly Dictionary<T, int> _order;
        public OrderComparer(Dictionary<T, int> order)
        {
            _order = order;
        }

        public int Compare(T x, T y)
        {
            return _order[x].CompareTo(_order[y]);
        }
    }

现在Add很容易。

    public void Add(T item)
    {
        if (!_order.ContainsKey(item))
        {
            _order[item] = _order.Count;
        }
        _inner.Add(item);
        _inner.Sort(new OrderComparer(_order));
    }

将所有内容放在一起可以使我做到这一点:

var rol = new RememberOrderList<int>();

rol.Add(1);
rol.Add(2);
rol.Add(3);
rol.Add(4);
rol.Add(5);

rol.Remove(2);
rol.Remove(3);
rol.Remove(4);

rol.Add(4);
rol.Add(3);
rol.Add(2);

从中我得到以下列表:

结果

现在,为了避免混淆,我再次使用20代替了2运行了此代码并得到了结果,{ 1, 20, 3, 4, 5 }以便按所需的行为对其进行排序。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章