A maneira mais fácil de resolver o problema é agrupar os elementos com base em seu valor e escolher um representante do grupo se houver mais de um elemento no grupo. No LINQ, isso se traduz em:
var query = lst.GroupBy(x => x)
.Where(g => g.Count() > 1)
.Select(y => y.Key)
.ToList();
Se você quiser saber quantas vezes os elementos são repetidos, você pode usar:
var query = lst.GroupBy(x => x)
.Where(g => g.Count() > 1)
.Select(y => new { Element = y.Key, Counter = y.Count() })
.ToList();
Isso retornará um List
de um tipo anônimo e cada elemento terá as propriedades Element
e Counter
, para recuperar as informações necessárias.
E, finalmente, se você procura um dicionário, pode usar
var query = lst.GroupBy(x => x)
.Where(g => g.Count() > 1)
.ToDictionary(x => x.Key, y => y.Count());
Isso retornará um dicionário, com seu elemento como chave, e o número de vezes que ele será repetido como valor.
code
for (int i = 0; i <duplicates.Count; i ++) {int duplicate = duplicatas [i]; duplicatesLocation.Add (duplicado, nova List <int> ()); for (int k = 0; k <hitsList.Length; k ++) {if (hitsList [k]. Contém (duplicado)) {duplicatesLocation.ElementAt (i) .Value.Add (k); }} // remove duplicatas de acordo com algumas regras. }code
Descubra se um enumerável contém alguma duplicata :
Descubra se todos os valores em um enumerável são únicos :
fonte
Outra maneira é usar
HashSet
:Se você deseja valores únicos na sua lista de duplicatas:
Aqui está a mesma solução que um método de extensão genérico:
fonte
List<int> { 1, 2, 3, 4, 5, 2 }
como fonte, o resultado é umIEnumerable<int>
com um elemento com o valor de1
(onde o valor duplicado correto é 2) #Console.WriteLine("Count: {0}", duplicates.Count());
diretamente abaixo e ela imprime6
. A menos que esteja faltando algo sobre os requisitos para esta função, deve haver apenas 1 item na coleção resultante.ToList
para corrigir o problema, mas isso significa que o método é executado assim que chamado, e não quando você itera os resultados.var hash = new HashSet<int>();
var duplicates = list.Where(i => !hash.Add(i));
levará a uma lista que inclui todas as ocorrências de duplicatas. Portanto, se você tiver quatro ocorrências de 2 em sua lista, sua lista duplicada conterá três ocorrências de 2, pois apenas uma das 2 pode ser adicionada ao HashSet. Se você deseja que sua lista contenha valores exclusivos para cada duplicata, use este código:var duplicates = mylist.Where(item => !myhash.Add(item)).ToList().Distinct().ToList();
Você consegue fazer isso:
Com estes métodos de extensão:
Usar IsMultiple () no método Duplicates é mais rápido que Count () porque isso não itera a coleção inteira.
fonte
Count()
é pré-calculado e sua solução provavelmente é mais lenta.Count()
] é basicamente diferente de iterar a lista inteira.Count()
é pré-calculado, mas a iteração de toda a lista não é.Eu criei uma extensão para responder a isso, você pode incluí-la em seus projetos, acho que isso retorna mais quando você procura por duplicatas na List ou no Linq.
Exemplo:
fonte
Para encontrar apenas os valores duplicados:
Por exemplo. var list = new [] {1,2,3,1,4,2};
então agrupar por agrupará os números por suas teclas e manterá a contagem (número de vezes que repetiu) com ele. Depois disso, estamos apenas verificando os valores que se repetiram mais de uma vez.
Para encontrar apenas os valores uniuqe:
Por exemplo. var list = new [] {1,2,3,1,4,2};
então agrupar por agrupará os números por suas teclas e manterá a contagem (número de vezes que repetiu) com ele. Depois disso, estamos apenas verificando os valores que repetiram apenas uma vez que as médias são únicas.
fonte
var unique = list.Distinct(x => x)
Conjunto completo de extensões Linq para SQL das funções Duplicadas verificadas no MS SQL Server. Sem usar .ToList () ou IEnumerable. Essas consultas são executadas no SQL Server e não na memória. . Os resultados retornam apenas na memória.
fonte
há uma resposta, mas eu não entendi porque não está funcionando;
minha solução é assim nessa situação;
fonte