Em Java, Arrays.equals()
permite comparar facilmente o conteúdo de duas matrizes básicas (sobrecargas estão disponíveis para todos os tipos básicos).
Existe uma coisa dessas em c #? Existe alguma maneira "mágica" de comparar o conteúdo de duas matrizes em C #?
Respostas:
Você poderia usar
Enumerable.SequenceEqual
. Isso funciona para qualquer umIEnumerable<T>
, não apenas para matrizes.fonte
SequenceEqual
pode não ser uma boa escolha em termos de desempenho, porque sua implementação atual pode enumerar completamente uma de suas fontes se elas diferirem apenas no comprimento. Com matrizes, poderíamos verificar aLength
igualdade primeiro, a fim de evitar enumerar matrizes de diferentes comprimentos apenas para acabar produzindofalse
.Use
Enumerable.SequenceEqual
no LINQ .fonte
new int[] {1}.SequenceEquals(null) == false
Também para matrizes (e tuplas), você pode usar novas interfaces do .NET 4.0: IStructuralComparable e IStructuralEquatable . Usando-os, você pode não apenas verificar a igualdade de matrizes, mas também compará-las.
fonte
a.StructuralCompare(b)
?Para o .NET 4.0 e superior, você pode comparar elementos na matriz ou nas tuplas usando o tipo StructuralComparisons :
fonte
SequenceEqual
retornará verdadeiro somente se duas condições ou forem atendidas.Se você deseja apenas verificar se eles contêm os mesmos elementos, independentemente da ordem deles, e seu problema é do tipo
você pode usar o método de extensão LINQ
Enumerable.Except
e verificar se o resultado tem algum valor. Aqui está um exemploE também usando isso, você obtém os diferentes itens também automaticamente. Dois pássaros com uma pedra.
Lembre-se, se você executar seu código assim
você obterá resultados diferentes.
No meu caso, tenho uma cópia local de uma matriz e quero verificar se alguma coisa foi removida da matriz original, portanto, uso esse método.
fonte
SequenceEqual
.Para testes de unidade, você pode usar em
CollectionAssert.AreEqual
vez deAssert.AreEqual
.É provavelmente a maneira mais fácil.
fonte
Se você deseja manipular as
null
entradas normalmente e ignorar a ordem dos itens, tente a seguinte solução:O código de teste é semelhante a:
fonte
a1 = { 1, 1 }
ea2 = { 1, 2 }
, então o primeiro teste retornará o resultado errado. A declaração de retorno deve serreturn array1.Count() == array2.Count() && !array1.Except(array2).Any() && !array2.Except(array1).Any();
Para algumas aplicações, pode ser melhor:
fonte
Esta solução LINQ funciona, não sei como ela se compara no desempenho com SequenceEquals. Mas ele lida com diferentes comprimentos de matriz e o .All sai no primeiro item que não é igual sem iterar por toda a matriz.
fonte
elementwise comparar? A respeito
Substitua a condição (a == b) por qualquer coisa que você queira comparar em a e b.
(isso combina dois exemplos de exemplos de Linq do desenvolvedor do MSDN )
fonte
true
) enull
matrizes (falharão).Eu fiz isso em estúdios visuais e funcionou perfeitamente; comparando matrizes índice por índice com um código curto.
a saída será; Os números correspondentes são 7 Os números não correspondentes são 3
fonte
null
matrizes (trava também) e faz outra coisa além do que o OP pediu. Ele apenas pediu para conhecer a igualdade, sem contar quantos itens diferem ou correspondem.Assumindo igualdade de matriz significa que ambas as matrizes têm elementos iguais em índices iguais, existe a
SequenceEqual
resposta e aIStructuralEquatable
resposta .Mas ambos têm desvantagens, em termos de desempenho.
SequenceEqual
a implementação atual não será um atalho quando as matrizes tiverem comprimentos diferentes e, portanto, poderá enumerar uma delas completamente, comparando cada um de seus elementos.IStructuralEquatable
não é genérico e pode causar o boxe de cada valor comparado. Além disso, não é muito simples de usar e já exige a codificação de alguns métodos auxiliares que o ocultam.Pode ser melhor, em termos de desempenho, usar algo como:
Mas é claro que essa também não é uma "maneira mágica" de verificar a igualdade de matrizes.
Portanto, atualmente, não, não existe realmente um equivalente ao Java
Arrays.equals()
no .Net.fonte
null
. Onde vc quer chegar?