Przecięcie można wykorzystać do znalezienia dopasowań między dwiema kolekcjami, np .:
// 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
}
Jednak to, co chciałbym osiągnąć, jest odwrotnie, chciałbym wymienić elementy z jednej kolekcji, których brakuje w drugiej :
// 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
źródło
źródło
Odpowiedzi:
Jak powiedziano, jeśli chcesz uzyskać 4, możesz zrobić w ten sposób:
Jeśli chcesz prawdziwego braku przecięcia (również 1 i 4), to powinno załatwić sprawę:
Nie będzie to najbardziej wydajne rozwiązanie, ale w przypadku małych list powinno działać dobrze.
źródło
Możesz użyć
Lub możesz użyć
źródło
SymmetricExceptWith
jest prawdopodobnie moją ulubioną metodą.Ten kod wylicza każdą sekwencję tylko raz i używa
Select(x => x)
do ukrycia wyniku, aby uzyskać czystą metodę rozszerzenia w stylu Linq. Ponieważ używaHashSet<T>
środowiskaO(n + m)
uruchomieniowego, to jeśli skróty są dobrze rozłożone. Zduplikowane elementy na obu listach są pomijane.źródło
Myślę, że możesz szukać
Except
:Sprawdź ten link , ten link lub Google, aby uzyskać więcej informacji.
źródło
Nie jestem w 100% pewien, co powinna zrobić twoja metoda NonIntersect (w odniesieniu do teorii mnogości) - czy to
B \ A (wszystko z B, które nie występuje w A)?
Jeśli tak, powinieneś być w stanie skorzystać z operacji wyjątku (B.Except (A)).
źródło
źródło
array1.NonIntersect (array2);
Nie przecinaj takiego operatora nie ma w Linq, powinieneś to zrobić
oprócz -> związek -> oprócz
źródło
źródło