2014-12-02 4 views
-1

이 문제에 대한 논리는 문제가 있습니다. 창에 표시되는 항목 목록이 있습니다. 항목이 목록에 있으면 해당 항목이 표시됩니다. 나는 이것을 바꿀 방법이 없다. 내가 편집 할 수있는 상속 된 클래스를 통해 목록에 액세스하고 있습니다. 어떤 방식 으로든 기본 클래스의 소스 코드를 편집 할 수는 없습니다 (목록이 들어있는 클래스). 제가 편집하고있는 클래스는리스트에 삽입 된 클래스입니다. 또한 목록에 액세스 할 수 있습니다.목록 순서 유지 및 제거 요소 추가 및 추가

목록에서 항목을 제거하고 동일한 순서를 유지하면서 항목을 제거 할 수 있어야합니다.

예 내 목록 인 경우 :

1,2,3,4,5 

내가 2,3,4를 제거 그때

1,5 

을하지만 그 순서대로 다시 4,3,2를 추가합니다. 그것은 다시하지

1,4,3,2,5 

그들은 그들이에 제거하는 원래 순서에 있어야합니다

1,2,3,4,5 

를 표시해야합니다. 이것은 이러한 값이 정렬 할 수 없습니다 단지 예입니다. 그들은 그들이 추가 된 순서대로입니다.

그래서 질문은 어떻게 목록에서 요소를 제거하고 추가하고 순서가 유지되는지 확인하는 것입니다.

이 나는 ​​시도했다 :

목록에서 요소를 제거하는 대신에 null 값을 삽입. 빈 자리가 표시 되어도 작동하지 않습니다. 또한 삭제 된 인덱스를 기억해 봤지만 목록에 다시 삽입하면 여러 항목이 인덱스 0에 다시 삽입되어 목록이 축소되어 순서가 손실 될 수 있습니다. 내가 ObservableCollection에 http://msdn.microsoft.com/en-us/library/ms668604(v=vs.110).aspx

을 사용하고

이 게시물은 내가 달성하기 위해 노력하고 무엇에 분명하다 바랍니다.

+0

본질적으로 정렬되지 않은 컬렉션의 원래 순서를 유지해야하는 경우 (예 : 정렬 된 목록) 요소를 "제거"하는 올바른 방법은 실제로 원하지 않는 요소가 제거 된 컬렉션의 필터링 된 복사본을 만드는 것입니다 . 다른 방법으로, 어디에서 제거되었는지를 추적하는 별도의 데이터 구조를 유지해야하므로 순서를 되돌릴 수 있습니다. –

+0

'SortedList'를 사용하려 했습니까? –

+0

"그럴 필요가있다"는 의미를 지정하십시오. 표시 목적으로 만 사용되는 경우 정렬 된 항목을 반환하는 메서드를 제공합니다. 'string.Join (",", list.OrderBy (x => x))' –

답변

2

다음은 당신을위한 아이디어입니다. 나는 당신이 원하는 않는 내 자신의 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)); 
    } 

모두 함께 날이 작업을 수행 할 수 있다는 퍼팅 단지 혼란을 피하기 위해 지금

Result

을, 나는 달렸다 이 코드는 다시 2 대신 20을 사용하고 결과는 { 1, 20, 3, 4, 5 }이므로 원하는 동작으로 정렬됩니다.

+0

감사합니다. – marsh