Eu tenho uma lista
List<MyObject> myList
e estou adicionando itens a uma lista e quero verificar se esse objeto já está na lista.
então antes de fazer isso:
myList.Add(nextObject);
Quero ver se nextObject já está na lista.
O objeto "MyObject" possui várias propriedades, mas a comparação é baseada na correspondência de duas propriedades.
Qual é a melhor maneira de fazer uma verificação antes de adicionar um novo "MyObject" a esta lista de "MyObject" s.
A única solução que pensei foi mudar de uma lista para um dicionário e, em seguida, transformar a chave em uma string concatenada das propriedades (isso parece um pouco deselegante).
Qualquer outra solução mais limpa usando lista ou LINQ ou outra coisa?
Basta usar o método Contains . Observe que funciona com base na função de igualdade
Equals
fonte
Se for possível usar essas 2 propriedades, você pode:
fonte
Tem certeza de que precisa de uma lista neste caso? Se você estiver preenchendo a lista com muitos itens, o desempenho será prejudicado com
myList.Contains
oumyList.Any
; o tempo de execução será quadrático. Você pode querer considerar o uso de uma estrutura de dados melhor. Por exemplo,Você pode usar um HashSet da seguinte maneira:
Claro, se esta definição de igualdade para
MyClass
for 'universal', você não precisa escrever umaIEqualityComparer
implementação; você pode simplesmente substituirGetHashCode
eEquals
na própria classe.fonte
Outro ponto a ser mencionado é que você deve garantir que sua função de igualdade seja a esperada. Você deve substituir o método equals para configurar quais propriedades do seu objeto devem corresponder para que duas instâncias sejam consideradas iguais.
Então você pode apenas fazer mylist.contains (item)
fonte
Aqui está um aplicativo de console rápido para descrever o conceito de como resolver seu problema.
Aproveitar!
fonte
Edit: Eu disse primeiro:
O que é deselegante na solução do dicionário. Parece perfeitamente elegante para mim, especialmente porque você só precisa definir o comparador na criação do dicionário.
É claro que não é elegante usar algo como uma chave quando também é o valor.
Portanto, eu usaria um HashSet. Se as operações posteriores exigissem indexação, eu criaria uma lista a partir dela quando a adição fosse concluída, caso contrário, apenas use o hashset.
fonte
Simples mas funciona
ou
fonte
Se você usar EF core, adicione
Exemplo
fonte