2011-05-12 13 views
7

Utilizando List<T> en mi proyecto, esta lista contiene cientos de entradas. Estoy usando el método List.Contains bastante y esto está perjudicando el rendimiento, reemplacé la lista con el diccionario, pero resultó en un cuello de botella de memoria, lo que hizo que el rendimiento fuera aún peor. ¿Hay alguna solución mejor que pueda sugerir para buscar en List? ¿Hay un reemplazo de HashSet<T> en C# 2.0 o de alguna otra manera que sea mejor tanto para la memoria como para la velocidad?Reemplazo de HashSet en C# 2.0

+0

¿Qué estás tratando de hacer? ¿Cuáles son las limitaciones de la lista? No ha proporcionado el tipo de información en la que debe basarse una recomendación. – Oded

+0

Lista Iam using, y List.Contains complejidad es O (N), por lo que está perjudicando el rendimiento. –

+0

¿Qué tipo de datos tienes en esta lista? Cientos de entradas no son tan normales. De todos modos, no explicas lo que estás haciendo con la lista. Decir 'Contiene' no significa nada. – Oded

Respuesta

0

Si puede vivir con el requisito de que se instale .Net 3.5 framework, puede usar el HashSet de .Net 3.5 (System.Core.dll) en un proyecto 2.0.

Ver esta pregunta: Using HashSet in C# 2.0, compatible with 3.5

Si eso es un no ir, me gustaría utilizar el diccionario en su lugar.

6

A Dictionary<T,bool> se puede utilizar en lugar de HashSet<T>. Si agrega elementos con un valor de Verdadero o Falso es un lanzamiento de moneda, el valor no es relevante.

Es más engorroso que HashSet<T>, y no es muy liviano, pero sin duda es mejor que 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

¡Esto funciona bien para mí! ¡Gracias! – Smartis