다음은 당신을위한 아이디어입니다. 나는 당신이 원하는 않는 내 자신의 IList<T>
클래스를 구현했습니다
먼저 나는이 시작 (나는 생각한다.) :
public class RememberOrderList<T> : IList<T>
{
}
내가 다음 T
의 _inner
목록을 생성하고 대부분을 구현했습니다 _inner
에 전달하여 필수 방법을 선택하십시오. Insert
& Add
-
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
은 색인을 지정하고 우리가 원하지 않는 문제이므로 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
은 쉽습니다.
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);
어떤에서 나는이 목록 수 :
public void Add(T item)
{
if (!_order.ContainsKey(item))
{
_order[item] = _order.Count;
}
_inner.Add(item);
_inner.Sort(new OrderComparer(_order));
}
모두 함께 날이 작업을 수행 할 수 있다는 퍼팅 단지 혼란을 피하기 위해 지금
을, 나는 달렸다 이 코드는 다시 2
대신 20
을 사용하고 결과는 { 1, 20, 3, 4, 5 }
이므로 원하는 동작으로 정렬됩니다.
본질적으로 정렬되지 않은 컬렉션의 원래 순서를 유지해야하는 경우 (예 : 정렬 된 목록) 요소를 "제거"하는 올바른 방법은 실제로 원하지 않는 요소가 제거 된 컬렉션의 필터링 된 복사본을 만드는 것입니다 . 다른 방법으로, 어디에서 제거되었는지를 추적하는 별도의 데이터 구조를 유지해야하므로 순서를 되돌릴 수 있습니다. –
'SortedList'를 사용하려 했습니까? –
"그럴 필요가있다"는 의미를 지정하십시오. 표시 목적으로 만 사용되는 경우 정렬 된 항목을 반환하는 메서드를 제공합니다. 'string.Join (",", list.OrderBy (x => x))' –