我在想出这个问题的逻辑时遇到了麻烦。我有一个窗口中显示的项目列表。如果列表中有项目,则会显示该项目。我没有办法改变这一点。我正在通过可以编辑的继承类访问列表。我无法以任何方式(包含列表的类)编辑基类的源代码。我正在编辑的类是插入列表中的类。它也有权访问该列表。
我需要能够从列表中删除项目并在保持相同顺序的同时插入它们。
例如,如果我的列表是:
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(); }
现在,有两种方法可以将项目添加到列表中- Insert
&Add
。
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] 删除。
我来说两句