O Intersect pode ser usado para encontrar correspondências entre duas coleções, assim:
// Assign two arrays.
int[] array1 = { 1, 2, 3 };
int[] array2 = { 2, 3, 4 };
// Call Intersect extension method.
var intersect = array1.Intersect(array2);
// Write intersection to screen.
foreach (int value in intersect)
{
Console.WriteLine(value); // Output: 2, 3
}
No entanto, o que eu gostaria de conseguir é o contrário, gostaria de listar itens de uma coleção que estão faltando na outra :
// Assign two arrays.
int[] array1 = { 1, 2, 3 };
int[] array2 = { 2, 3, 4 };
// Call "NonIntersect" extension method.
var intersect = array1.NonIntersect(array2); // I've made up the NonIntersect method
// Write intersection to screen.
foreach (int value in intersect)
{
Console.WriteLine(value); // Output: 4
}
c#
.net
collections
intersect
Peter Bridger
fonte
fonte
Respostas:
Como afirmado, se você deseja obter 4 como resultado, pode fazer o seguinte:
Se você deseja a não interseção real (também 1 e 4), faça o seguinte:
Essa não será a solução com melhor desempenho, mas para listas pequenas ela deve funcionar muito bem.
fonte
Você pode usar
Ou você pode usar
fonte
SymmetricExceptWith
provavelmente é o meu método favorito.Esse código enumera cada sequência apenas uma vez e usa
Select(x => x)
para ocultar o resultado para obter um método de extensão limpo no estilo Linq. Como ele usaHashSet<T>
seu tempo de execução, éO(n + m)
se os hashes estão bem distribuídos. Elementos duplicados em qualquer lista são omitidos.fonte
Eu acho que você pode estar procurando
Except
:Confira este link , este link ou o Google para obter mais informações.
fonte
Não tenho 100% de certeza do que seu método NonIntersect deve fazer (em relação à teoria dos conjuntos) - é
B \ A (tudo de B que não ocorre em A)?
Se sim, você poderá usar a operação Except (B.Except (A)).
fonte
fonte
array1.NonIntersect (array2);
Se um operador não digitalizado não estiver presente no Linq, você deve
exceto -> união -> exceto
fonte
fonte