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
Respuesta
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.
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>
.
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();
}
}
¡Esto funciona bien para mí! ¡Gracias! – Smartis
- 1. Uso de HashSet en C# 2.0, compatible con 3.5
- 2. recuperar un objeto de hashset en C#
- 3. C# Hashset conversión a listas
- 4. ¿Cómo reemplazo glBegin() y funciones relacionadas en OpenGL ES 2.0?
- 5. HashSet Iterando al eliminar elementos en C#
- 6. HashSet
- 7. ¿Lenguaje de reemplazo para C++?
- 8. Reemplazo de #import en Visual C++
- 9. Reemplazo de cadena en Objective-C
- 10. Reemplazo de realloc (C -> C++)
- 11. Convertir C# HashSet a F # Set
- 12. C# hashset Contiene no únicos objetos
- 13. Expresión reemplazo mayúsculas regular en C#
- 14. Método de extensión en C# 2.0
- 15. Hashset equivalente en SQL Server
- 16. C todo el contenido de HashSet <string>
- 17. HashSet permite la inserción de elementos duplicados - C#
- 18. Equivalente de HashSet de Java en PHP
- 19. ¿Complejidad de búsqueda de HashSet?
- 20. Orden de iteración de HashSet
- 21. Definir: ¿Qué es un HashSet?
- 22. hashset vs IQueryable
- 23. Scala equivalente de nueva HashSet (Colección)
- 24. Obtener elemento aleatorio de hashset?
- 25. HashSet como DataSource
- 26. HashSet permite duplicados
- 27. OAuth 2.0 en C++ (para UNIX)
- 28. Argumentos opcionales en Objective-C 2.0?
- 29. Necesita duplicados permitidos en SortedCollection (C#, 2.0)
- 30. copia superficial de un hashset
¿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
Lista Iam using, y List.Contains complejidad es O (N), por lo que está perjudicando el rendimiento. –
¿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