Tôi có 2 Danh sách riêng biệt và tôi cần so sánh hai danh sách đó và nhận mọi thứ nhưng giao điểm của hai danh sách. Làm thế nào tôi có thể làm điều này (C#)?Lấy sự khác biệt đối xứng từ danh sách chung
Trả lời
Bạn có thể sử dụng Except để nhận mọi thứ trừ giao lộ trong hai danh sách.
var differences = listA.Except(listB).Union(listB.Except(listA));
Nếu bạn muốn để có được tất cả mọi thứ nhưng đoàn:
var allButUnion = new List<MyClass>();
(Các công đoàn là tất cả mọi thứ trong cả hai danh sách - tất cả mọi thứ nhưng công đoàn là tập rỗng ...)
Cho rằng bạn đang sử dụng từ "giao lộ" để mô tả ý nghĩa của nó bằng tiếng Anh, không có ý nghĩa để sử dụng nó trong mã?:) –
hehehe, true :) –
Mặc dù, tôi có vẻ nhớ, khi tôi phải làm điều này cho một cái gì đó, điều này có hiệu quả hơn một chút so với tổng số công đoàn và loại bỏ giao lộ ... –
Bạn có nghĩa là mọi thứ chỉ có trong một danh sách hoặc mục khác? Làm thế nào về:
var allButIntersection = a.Union(b).Except(a.Intersect(b));
Đó có thể là một chút không hiệu quả, nhưng nó khá đơn giản cho biết ý bạn là gì (giả sử tôi đã phiên dịch bạn một cách chính xác).
Sử dụng Trừ:
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);
Điều đó không chỉ trả lại các mục trong l1 không có trong l2? Điều gì sẽ xảy ra nếu có các mục trong l2 không có trong l1? –
Nếu bạn có nghĩa là tập hợp của tất cả mọi thứ nhưng ngã tư (chênh lệch đối xứng), bạn có thể thử:
var set = new HashSet<Type>(list1);
set.SymmetricExceptWith(list2);
Tuyệt vời - có vẻ như cách tốt nhất để làm điều đó với tôi. –
Rất đẹp! Đó là sạch hơn nhiều so với những gì tôi đã có. –
var theUnion = list1.Concat(list2);
var theIntersection = list1.Intersect(list2);
var theSymmetricDifference = theUnion.Except(theIntersection);
Something như thế này?
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();
Đây là phương pháp mở rộng chung. Rosetta Code sử dụng Concat, và Djeefther Souza nói nó hiệu quả hơn.
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));
}
}
Tôi chưa thực sự đánh giá nó. Tôi nghĩ rằng nó sẽ phụ thuộc vào cách Union và Concat được thực hiện. Trong thế giới mơ ước của tôi, .NET sử dụng một thuật toán khác nhau tùy thuộc vào loại dữ liệu hoặc kích thước thiết lập, mặc dù cho IEnumerable nó không thể xác định kích thước thiết lập trước.
Ngoài ra, bạn có thể bỏ qua khá nhiều câu trả lời của tôi - Jon Skeet nói rằng phương pháp HashSet "Tuyệt vời - trông giống như cách tốt nhất để làm điều đó với tôi."
- 1. JAXB không phải danh sách giao diện bất đối xứng
- 2. Tại sao sự khác biệt trong việc khai báo Danh sách chung?
- 3. Danh sách chung/Từ điển
- 4. Truyền danh sách chung cho một lớp được lấy từ danh sách
- 5. Danh sách Haskell khác biệt
- 6. Whats sự khác biệt giữa danh sách [-1:] [0] và danh sách [len (danh sách) -1]?
- 7. Sự khác biệt giữa Danh sách <T> và Danh sách <object>?
- 8. Scala sự khác biệt của hai danh sách
- 9. LINQ tìm sự khác biệt trong hai danh sách
- 10. Sự khác biệt số của danh sách trong Mathematica
- 11. foreach loop Danh sách sự khác biệt hiệu suất
- 12. Sự khác biệt thực tế giữa Danh sách và IEnumerable
- 13. Bash - Sự khác biệt giữa hai danh sách
- 14. Nếu đối tượng là Danh sách chung
- 15. Mật mã đối xứng và không đối xứng, không từ chối?
- 16. Xóa danh sách các đối tượng khỏi danh sách khác
- 17. sao chép danh sách python: có sự khác biệt giữa [cũ] và danh sách (cũ) không?
- 18. So sánh hai danh sách và trả lại giá trị khác biệt và sự khác biệt
- 19. C# lấy danh sách từ một trường trong danh sách
- 20. Học Python từ Ruby; Sự khác biệt và tương đồng
- 21. So sánh hai Danh sách cho các khác biệt
- 22. Lấy danh sách các thuộc tính từ Danh sách đối tượng
- 23. cách lấy danh sách phụ từ danh sách trong ocaml
- 24. Sự khác biệt giữa đối tượng và từ điển?
- 25. C# mảng vs danh sách chung
- 26. Nơi lấy danh sách các loại sự kiện?
- 27. Sự khác biệt giữa findAll, getAll và danh sách trong Grails
- 28. Lấy danh sách tập tin từ TFS
- 29. Ràng buộc Guice cho Danh sách các đối tượng chung
- 30. List.Contains (mục) với danh sách chung của các đối tượng
bạn đã thử những gì? – fretje
bạn có ý gì bởi mọi thứ trừ công đoàn? –
Mọi thứ nhưng công đoàn luôn không có gì. Bạn có nghĩa là tất cả mọi thứ ngoại trừ giao lộ? –