¿Cuál es la forma más eficaz de almacenar una lista de cadenas ignorando los duplicados? Estaba pensando que un diccionario puede ser mejor insertando cadenas escribiendo dict [str] = false; y enumerando las claves como una lista. ¿Es una buena solución?
86
HashSet
perderá el orden de los artículos. Una característica queList
proporciona.Puedes buscar hacer algo como esto
var hash = new HashSet<string>(); var collectionWithDup = new []{"one","one","two","one","two","zero"}; // No need to check for duplicates as the Add method // will only add it if it doesn't exist already foreach (var str in collectionWithDup) hash.Add(str);
fuente
No estoy seguro de si esto cuenta como una buena respuesta, pero cuando me enfrenté a la necesidad de un conjunto único que mantuviera el orden de inserción, me comprometí con un HashSet y una Lista uno al lado del otro. En este caso, siempre que agregue al conjunto, haga lo siguiente:
if(hashSet.Add(item)) orderList.Add(item);
Al quitar elementos, asegúrese de quitarlos de ambos. Por lo tanto, siempre que pueda estar seguro de que nada más agregó elementos a la lista, ¡tendrá un conjunto único ordenado por inserción!
fuente
También puede usar Linq como en:
using System.Linq; var items = new List<string>() { "one", "one", "two", "one", "two", "zero" }; List<string> distinctItems = items.Distinct().ToList();
fuente
Use HashSet, no es necesario verificar .Contains (), simplemente agregue sus elementos en la lista y si está duplicado, no lo agregará.
HashSet<int> uniqueList = new HashSet<int>(); uniqueList.Add(1); // List has values 1 uniqueList.Add(2); // List has values 1,2 uniqueList.Add(1); // List has values 1,2 Console.WriteLine(uniqueList.Count); // it will return 2
fuente
Esto no es parte del espacio de nombres del sistema, pero ha utilizado las colecciones Iesi.Collections de http://www.codeproject.com/KB/recipes/sets.aspx con NHibernate. Tiene soporte para conjuntos hash junto con conjuntos ordenados, conjuntos de diccionarios, etc. Desde que se ha utilizado con NHibernate se ha utilizado de forma extensiva y muy estable. Esto tampoco requiere .Net 3.5
fuente
Aquí hay otra solución sin usar
HashSet
.var items = new List<string>() { "one", "one", "two", "one", "two", "zero" }; var uniqueItems = items.Where((item, index) => items.IndexOf(item) == index);
Fue adoptado de este hilo: javascript - Valores únicos en una matriz
Prueba:
using FluentAssertions; uniqueItems.Count().Should().Be(3); uniqueItems.Should().BeEquivalentTo("one", "two", "zero");
Prueba de rendimiento para
List
,HashSet
ySortedSet
. 1 millón de iteraciones:Probar código fuente (esencia)
fuente