Mam 2 oddzielne listy i muszę porównać oba i uzyskać wszystko , ale na przecięciu tych dwóch list. Jak mogę to zrobić (C#)?Uzyskaj różnicę symetryczną od ogólnych list.
Odpowiedz
Możesz użyć numeru Except, aby uzyskać wszystkie, oprócz , skrzyżowanie obu list.
var differences = listA.Except(listB).Union(listB.Except(listA));
Jeśli chcesz dostać wszystko oprócz unii:
var allButUnion = new List<MyClass>();
(Związek jest wszystko w obu listach - wszystko ale Unia jest zbiorem pustym ...)
Biorąc pod uwagę, że używasz słowa "przecięcie", aby opisać, co to znaczy po angielsku, czy to nie ma sensu używać go również w kodzie?:) –
hehehe, prawda :) –
Chociaż wydaje mi się, że pamiętam, kiedy musiałem to zrobić dla czegoś, to było trochę bardziej wydajne niż robienie total union i usuwanie skrzyżowania ... –
Czy masz na myśli wszystko, co tylko na jednej liście: lub inne? Jak o:
var allButIntersection = a.Union(b).Except(a.Intersect(b));
To może być nieco nieefektywne, ale to dość po prostu wskazuje, co masz na myśli (zakładając, że mam cię interpretowane poprawnie, oczywiście).
Korzystanie z wyjątkiem:
List<int> l1 = new List<int>(new[] { 1, 2, 3, 4 });
List<int> l2 = new List<int>(new[] { 2, 4 });
var l3 = l1.Except(l2);
Czy po prostu nie zwrócą rzeczy z l1, które nie są w l2? A co jeśli w L2 są przedmioty w l1? –
Jeśli masz na myśli zbiór wszystkiego, ale przecięcia (różnica symetryczna) można spróbować:
var set = new HashSet<Type>(list1);
set.SymmetricExceptWith(list2);
Doskonały - to wygląda na najlepszy sposób robienia tego dla mnie. –
Bardzo ładne! To znacznie czystsze niż to, co miałem. –
var theUnion = list1.Concat(list2);
var theIntersection = list1.Intersect(list2);
var theSymmetricDifference = theUnion.Except(theIntersection);
coś takiego?
String[] one = new String[] { "Merry", "Metal", "Median", "Medium", "Malfunction", "Mean", "Measure", "Melt", "Merit", "Metaphysical", "Mental", "Menial", "Mend", "Find" };
String[] two = new String[] { "Merry", "Metal", "Find", "Puncture", "Revise", "Clamp", "Menial" };
List<String> tmp = one.Except(two).ToList();
tmp.AddRange(two.Except(one));
String[] result = tmp.ToArray();
Oto ogólna metoda rozszerzenia. Kod Rosetty używa Concata, a Djeefther Souza mówi, że jest bardziej wydajny.
public static class LINQSetExtensions
{
// Made aware of the name for this from Swift
// https://stackoverflow.com/questions/1683147/get-the-symmetric-difference-from-generic-lists
// Generic implementation adapted from https://www.rosettacode.org/wiki/Symmetric_difference
public static IEnumerable<T> SymmetricDifference<T>(this IEnumerable<T> first, IEnumerable<T> second)
{
// I've used Union in the past, but I suppose Concat works.
// No idea if they perform differently.
return first.Except(second).Concat(second.Except(first));
}
}
Nie testowałem tego. Myślę, że będzie to zależeć od tego, w jaki sposób wdrażane są Unia kontra konkluzje. W moim świecie snów .NET używa innego algorytmu, w zależności od typu danych lub ustalonego rozmiaru, choć dla IEnumerable nie może on wcześniej ustalić ustalonego rozmiaru.
Ponadto, możesz zignorować moją odpowiedź - Jon Skeet mówi, że metoda HashSet "Excellent - to wygląda na najlepszy sposób robienia tego dla mnie".
- 1. Uzyskaj różnicę dat w VB.NET
- 2. Dlaczego jest różnica w deklaracji ogólnych list?
- 3. JavaScript porównaj łańcuchy i uzyskaj różnicę końcową
- 4. Porównaj dwa ciągi i uzyskaj różnicę
- 5. Uzyskaj elementy nieodróżnialne od IEnumerable
- 6. Błąd operatora konwersji jednoznacznej podczas konwertowania ogólnych list
- 7. Uzyskaj różnicę między dwiema listami przy użyciu LINQ
- 8. Uzyskaj odpowiedzi od PostAsJsonAsync
- 9. Uzyskaj SqlConnection od DbConnection
- 10. Uzyskaj TypeSyntax od ITypeSymbol
- 11. Uzyskaj JavaSparkContext od SparkSession
- 12. Uzyskaj zbiorczą różnicę w git dla wielu niekonsekwencyjnych zatwierdzeń
- 13. Inicjowanie tablicy ogólnych kolekcji o różnych argumentach ogólnych
- 14. Uzyskaj wartość od wyszukiwania C#
- 15. Uzyskaj adresy IPv4 od Dns.GetHostEntry()
- 16. Uzyskaj rzeczownik od czasownika Wordnet
- 17. Uzyskaj nazwę kontrolera od $ scope
- 18. Uzyskaj nazwę pliku od FileOutputStream
- 19. Uzyskaj identyfikator zasobu od nazwy
- 20. Uzyskaj WOEID od nazwy miasta?
- 21. Android Uzyskaj klucze od preferences.xml
- 22. Uzyskaj czas od ciągu daty
- 23. Uzyskaj różnicę stref czasowych między klientem a serwerem
- 24. Uzyskaj różnicę między dwoma datami w miesiącach przy użyciu Javy
- 25. Odejmij daty w Ruby i uzyskaj różnicę w minutach
- 26. Uzyskaj różnicę między dwoma datami w MySQL jako liczbą całkowitą
- 27. Sortowanie listę list od długości i wartości
- 28. Kiedy powinieneś używać typów ogólnych?
- 29. Jak uzyskać różnicę między dwiema datami pod bash?
- 30. Jakie jest znaczenie nowej adnotacji @SystemApi, jakąkolwiek różnicę od @hide?
co już wypróbowałeś? – fretje
co masz na myśli przez wszystko, ale związek? –
Wszystko oprócz związku jest zawsze niczym. Czy masz na myśli wszystko oprócz skrzyżowania? –