La forma más fácil de resolver el problema es agrupar los elementos en función de su valor y luego elegir un representante del grupo si hay más de un elemento en el grupo. En LINQ, esto se traduce en:
var query = lst.GroupBy(x => x)
.Where(g => g.Count() > 1)
.Select(y => y.Key)
.ToList();
Si desea saber cuántas veces se repiten los elementos, puede usar:
var query = lst.GroupBy(x => x)
.Where(g => g.Count() > 1)
.Select(y => new { Element = y.Key, Counter = y.Count() })
.ToList();
Esto devolverá un List
tipo anónimo, y cada elemento tendrá las propiedades Element
y Counter
, para recuperar la información que necesita.
Y, por último, si está buscando un diccionario, puede usar
var query = lst.GroupBy(x => x)
.Where(g => g.Count() > 1)
.ToDictionary(x => x.Key, y => y.Count());
Esto devolverá un diccionario, con su elemento como clave, y la cantidad de veces que se repite como valor.
code
for (int i = 0; i <duplicates.Count; i ++) {int duplicate = duplicates [i]; duplicatesLocation.Add (duplicado, nueva Lista <int> ()); for (int k = 0; k <hitsList.Length; k ++) {if (hitsList [k] .Contains (duplicate)) {duplicatesLocation.ElementAt (i) .Value.Add (k); }} // eliminar duplicados de acuerdo con algunas reglas. }code
Averigüe si un enumerable contiene algún duplicado :
Averigüe si todos los valores en un enumerable son únicos :
fuente
Otra forma es usar
HashSet
:Si desea valores únicos en su lista de duplicados:
Aquí está la misma solución que un método de extensión genérico:
fuente
List<int> { 1, 2, 3, 4, 5, 2 }
como fuente, el resultado es unIEnumerable<int>
elemento con un valor de1
(donde el valor duplicado correcto es 2)Console.WriteLine("Count: {0}", duplicates.Count());
directamente debajo e imprime6
. A menos que me falte algo sobre los requisitos para esta función, solo debe haber 1 elemento en la colección resultante.ToList
para solucionar el problema, pero significa que el método se ejecuta tan pronto como se lo llamó, y no cuando iteras sobre los resultados.var hash = new HashSet<int>();
var duplicates = list.Where(i => !hash.Add(i));
conducirá a una lista que incluye todas las ocurrencias de duplicados. Entonces, si tiene cuatro ocurrencias de 2 en su lista, entonces su lista duplicada contendrá tres ocurrencias de 2, ya que solo una de las 2 se puede agregar al HashSet. Si desea que su lista contenga valores únicos para cada duplicado, use este código en su lugar:var duplicates = mylist.Where(item => !myhash.Add(item)).ToList().Distinct().ToList();
Puedes hacerlo:
Con estos métodos de extensión:
Usar IsMultiple () en el método Duplicados es más rápido que Count () porque esto no itera toda la colección.
fuente
Count()
está precalculada y que su solución es más lenta.Count()
] es básicamente diferente de iterar toda la lista.Count()
está precalculado pero no lo está iterando toda la lista.Creé una extensión para responder a esto, podría incluirlo en sus proyectos, creo que esto devuelve la mayoría de los casos cuando busca duplicados en List o Linq.
Ejemplo:
fuente
Para buscar solo los valores duplicados:
P.ej. var list = new [] {1,2,3,1,4,2};
entonces group by agrupará los números por sus teclas y mantendrá la cuenta (número de veces que se repitió) con él. Después de eso, solo estamos verificando los valores que se han repetido más de una vez.
Para encontrar solo los valores únicos:
P.ej. var list = new [] {1,2,3,1,4,2};
entonces group by agrupará los números por sus teclas y mantendrá la cuenta (número de veces que se repitió) con él. Después de eso, solo estamos verificando los valores que han repetido solo una vez que los medios son únicos.
fuente
var unique = list.Distinct(x => x)
Conjunto completo de extensiones de Linq a SQL de funciones duplicadas marcadas en MS SQL Server. Sin usar .ToList () o IEnumerable. Estas consultas se ejecutan en SQL Server en lugar de en memoria. . Los resultados solo vuelven a la memoria.
fuente
hay una respuesta pero no entendí por qué no funciona;
mi solución es así en esta situación;
fuente