2011-05-12 3 views
7

내 프로젝트에 List<T>을 사용하고 있는데이 목록에는 수백 개의 항목이 들어 있습니다. List.Contains 메서드를 많이 사용하고 있는데 성능이 좋지 않습니다. 목록을 사전으로 바꾸었지만 메모리 병목 현상이 발생하여 성능이 최악이되었습니다. 목록에서 검색 할 때 제안 할 수있는 더 나은 솔루션이 있습니까? HashSet<T>이 C# 2.0 또는 메모리와 속도가 현명한 다른 방법으로 대체 되었습니까?C# 2.0의 HashSet 대체

+0

무엇을하려고합니까? 목록 제약 조건은 무엇입니까? 추천을 기반으로해야하는 정보를 제공하지 않았습니다. – Oded

+0

목록 Iam을 사용하고 List.Contains 복잡성은 O (N)이므로 성능이 저하됩니다. –

+0

이 목록에 어떤 종류의 데이터가 있습니까? 수백 가지 항목이 그다지 일반적이지 않습니다. 관계없이, 당신은 당신이 목록으로 무엇을하는지 설명하지 않습니다. '함유'는 아무것도 의미하지 않습니다. – Oded

답변

0

.Net 3.5 프레임 워크를 설치해야하는 경우 2.0 프로젝트에서 .Net 3.5 (System.Core.dll)의 HashSet을 사용할 수 있습니다.

이 질문을 참조하십시오 : 그것은 더 이동 없다면 Using HashSet in C# 2.0, compatible with 3.5

을, 내가 대신 사전을 사용할 수 있습니다.

6

Dictionary<T,bool>HashSet<T> 대신 사용될 수 있습니다. True 또는 False 값을 가진 항목을 추가 할 때 동전 던지기 여부와 상관없이 값은 적합하지 않습니다.

HashSet<T>보다 성가 시며 꽤 가벼운 것은 아니지만 확실히 List<T>보다 좋습니다.

3
public class HashCollection <T> : ICollection <T> 
{ 
    private Dictionary<T, bool> _innerDictionary; 

    public HashCollection() 
    { 
     _innerDictionary = new Dictionary<T, bool>(); 
    } 

    void ICollection <T>.Add(T item) 
    { 
     AddInternal(item); 
    } 

    private void AddInternal(T item) 
    { 
     _innerDictionary.Add(item, false); 
    } 

    public bool Add(T item) 
    { 
     if (_innerDictionary.ContainsKey(item)) 
      return false; 

     AddInternal(item); 
     return true; 
    } 

    public void Clear() 
    { 
     _innerDictionary.Clear(); 
     _innerDictionary = new Dictionary<T, bool>(); 
    } 

    public bool Contains(T item) 
    { 
     return _innerDictionary.ContainsKey(item); 
    } 

    public void CopyTo(T[] array, int arrayIndex) 
    { 
     _innerDictionary.Keys.CopyTo(array, arrayIndex); 
    } 

    public int Count 
    { 
     get { return _innerDictionary.Keys.Count; } 
    } 

    public bool IsReadOnly 
    { 
     get 
     { 
      return false; 
     } 
    } 

    public bool Remove(T item) 
    { 
     return _innerDictionary.Remove(item); 
    } 

    public IEnumerator<T> GetEnumerator() 
    { 
     return _innerDictionary.Keys.GetEnumerator(); 
    } 

    System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() 
    { 
     return GetEnumerator(); 
    } 
} 
+0

이것은 나를 위해 잘 작동합니다! 고맙습니다! – Smartis