remove duplicates list c# linq
Lista eficiente de cadenas Ășnicas C# (7)
Aquí hay otra solución sin usar el 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
y SortedSet
. 1 millón de iteraciones:
List: 564 ms
HashSet: 487 ms
SortedSet: 1932 ms
¿Cuál es la forma más eficiente de almacenar una lista de cadenas ignorando los duplicados? Estaba pensando que un diccionario puede ser la mejor forma de insertar cadenas escribiendo dict [str] = false; y enumerar a través de las teclas como una lista. ¿Es esa una buena solución?
Esto no forma parte del espacio de nombres del sistema, pero usó Iesi.Collections desde http://www.codeproject.com/KB/recipes/sets.aspx con NHibernate. Tiene soporte para conjunto hash junto con conjunto ordenado, conjunto de diccionario, etc. Dado que se ha usado con NHibernate, se ha usado de manera extensiva y muy estable. Esto tampoco requiere .Net 3.5
No estoy seguro de si esto cuenta como una buena respuesta, pero cuando me enfrento a la necesidad de un conjunto único que mantenga el orden de inserción, me comprometí con un HashSet y una lista uno al lado del otro. En este caso, cada vez que agregue al conjunto, haga lo siguiente:
if(hashSet.Add(item))
orderList.Add(item);
Al eliminar elementos, asegúrese de eliminarlos de ambos. Por lo tanto, siempre y cuando pueda estar seguro de que nada más agregó elementos a la lista, ¡tendrá un conjunto único ordenado por inserción!
Puedes mirar para 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);
Si está utilizando .NET 3.5, el HashSet debería funcionar para usted.
La clase HashSet <(Of <(T>)>) proporciona operaciones de conjunto de alto rendimiento. Un conjunto es una colección que no contiene elementos duplicados y cuyos elementos no están en ningún orden particular.
También puedes usar Linq como en:
using System.Linq;
var items = new List<string>() { "one", "one", "two", "one", "two", "zero" };
List<string> distinctItems = items.Distinct().ToList();
Use HashSet, no necesita marcar .Contains (), solo 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