Então, eu tenho uma coleção de objetos. O tipo exato não é importante. A partir dele, quero extrair todos os pares únicos de um par de propriedades particulares, assim:
myObjectCollection.Select(item=>new
{
Alpha = item.propOne,
Bravo = item.propTwo
}
).Distinct();
Portanto, minha pergunta é: Neste caso, Distinct usará o objeto padrão igual a (que será inútil para mim, já que cada objeto é novo) ou pode ser dito para fazer iguais diferentes (nesse caso, valores iguais de Alpha e Bravo => instâncias iguais)? Existe alguma maneira de alcançar esse resultado, se isso não acontecer?
Respostas:
Leia o excelente post de K. Scott Allen aqui:
E igualdade para todos ... Tipos anônimos
A resposta curta (e cito):
Portanto, é totalmente seguro usar o método Distinct () em uma consulta que retorna tipos anônimos.
fonte
Desculpe pela formatação desarrumada anteriormente
fonte
object
eobject
. Se a ambosobject
éstring
ainda retornar as linhas duplicadas. Experimente o tipoFirstName
typeofobject
e atribua com o mesmostring
lá.Interessante que ele funcione em C #, mas não em VB
Retorna as 26 letras:
Retorna 52 ...
fonte
Key
palavra-chave ao tipo anônimo,.Distinct()
ela funcionará como pretendido (por exemploNew With { Key .lower = x.ToString.ToLower(), Key .upper = x.ToString.ToUpper()}
).new {A = b}
éNew {Key .A = b}
. Propriedades não-chave em classes VB anônimas são mutáveis, e é por isso que são comparadas por referência. Em C #, todas as propriedades de classes anônimas são imutáveis.Fiz um pequeno teste e descobri que, se as propriedades são do tipo valor, parece funcionar bem. Se eles não são tipos de valor, o tipo precisa fornecer suas próprias implementações Equals e GetHashCode para que funcione. Penso que as cordas funcionariam.
fonte
Você pode criar seu próprio método de extensão distinta, que utiliza a expressão lambda. Aqui está um exemplo
Crie uma classe que deriva da interface IEqualityComparer
Em seguida, crie seu método Distinct Extension
e você pode usar esse método para encontrar itens distintos
fonte
object
eobject
. Se a ambosobject
éstring
ainda retornar as linhas duplicadas. Experimente o tipoFirstName
typeofobject
e atribua com o mesmostring
lá.Se
Alpha
eBravo
ambos herdarem de uma classe comum, você poderá ditar a verificação de igualdade na classe pai implementandoIEquatable<T>
.Por exemplo:
fonte
Olá, eu tenho o mesmo problema e encontrei uma solução. Você precisa implementar a interface IEquatable ou simplesmente substituir os métodos (Equals & GetHashCode). Mas esse não é o truque, o truque que vem no método GetHashCode. Você não deve retornar o código de hash do objeto de sua classe, mas deve retornar o hash da propriedade que deseja comparar dessa forma.
Como você vê, eu recebi uma classe chamada person e tenho 3 propriedades (Name, Age, IsEgyptian "Porque eu sou"). No GetHashCode, retornei o hash da propriedade Name e não o objeto Person.
Experimente e funcionará o ISA. Obrigado, Modather Sadik
fonte
public override int GetHashCode() { return this.Name.GetHashCode() ^ this.Age.GetHashCode() ^ this.IsEgyptian.GetHashCode(); }
Para que ele funcione no VB.NET, você precisa especificar o
Key
palavra chave antes de cada propriedade do tipo anônimo, assim:Eu estava lutando com isso, pensei que o VB.NET não suporta esse tipo de recurso, mas na verdade ele suporta.
fonte