Có phương pháp LINQ nào để tìm sự khác biệt giữa hai bộ từ điển chung?
Tương tự như trong this question, nhưng với từ điển chung chung.tìm sự khác biệt giữa hai từ điển
Trả lời
var diff = dicOne.Except(dicTwo).Concat(dicTwo.Except(dicOne));
phương pháp này chỉ so sánh các phím? –
@ bto.rdz Không, cả khóa và giá trị. – Magnus
Tuyệt vời nhưng đừng quên kiểm tra 'null' –
giống như thế này?
var dicOne = new Dictionary<string, string>(){ {"asdf", "asdf"}, {"few","faew"}};
var dicTwo = new Dictionary<string, string>(){ {"asdf", "asdf"}};
var unContained = dicOne.Where(x => !dicTwo.Contains(x));
Không chỉ bao gồm các phần tử đó trong' dictTwo' nhưng không có trong 'dictOne'. –
Nếu hiệu suất là rất quan trọng, bạn có thể muốn sử dụng tra cứu băm của lớp từ điển và có được một sự cải thiện tốc độ. Tôi đã lấy một kịch bản thử nghiệm của một từ điển với 1 triệu mục, sao chép sâu nó và thực hiện 10 chỉnh sửa (5 mục đã bị xóa, thêm 5) vào bản sao. [Tôi đã có một nhiệm vụ để làm điều đó liên quan đến việc tìm kiếm những thay đổi trong dữ liệu, và sau đó chỉ đẩy các thay đổi thông qua một chức năng khác.]
Với thời gian LINQ (xem câu trả lời Magnus) đã trôi qua theo Đồng hồ bấm giờ là 3600ms. Với so sánh đơn giản bằng cách sử dụng Dictionary.Contains(), thời gian trôi qua là khoảng 600ms. Môi trường là Visual Studio 2017 Cộng đồng trong chế độ gỡ lỗi cho một khai thác kiểm tra ConsoleApp, trên cùng một máy.
Số dặm của bạn có thể thay đổi và bạn có thể có số dòng khiêm tốn, vì vậy có thể không quan trọng, nhưng đối với các từ điển lớn hơn, nó trả tiền để sử dụng chức năng tra cứu của lớp Từ điển.
public static void DiffDictionaries<T, U>(
Dictionary<T, U> dicA,
Dictionary<T, U> dicB,
Dictionary<T, U> dicAdd,
Dictionary<T, U> dicDel)
{
// dicDel has entries that are in A, but not in B,
// ie they were deleted when moving from A to B
diffDicSub<T, U>(dicA, dicB, dicDel);
// dicAdd has entries that are in B, but not in A,
// ie they were added when moving from A to B
diffDicSub<T, U>(dicB, dicA, dicAdd);
}
private static void diffDicSub<T, U>(
Dictionary<T, U> dicA,
Dictionary<T, U> dicB,
Dictionary<T, U> dicAExceptB)
{
// Walk A, and if any of the entries are not
// in B, add them to the result dictionary.
foreach (KeyValuePair<T, U> kvp in dicA)
{
if (!dicB.Contains(kvp))
{
dicAExceptB[kvp.Key] = kvp.Value;
}
}
}
- 1. Sự khác biệt giữa HashMap và từ điển ADT
- 2. Sự khác biệt giữa đối tượng và từ điển?
- 3. Sự khác biệt giữa Hashtable và Từ điển là gì?
- 4. Subversion: Cách tìm sự khác biệt giữa hai thẻ?
- 5. Tìm vị trí của sự khác biệt giữa hai chuỗi
- 6. Sự khác biệt giữa hai NSDates
- 7. sự khác biệt giữa hai mảng
- 8. 'Sự khác biệt' giữa hai quaternions
- 9. Cách ngắn gọn để tìm sự khác biệt "chính" giữa 2 từ điển?
- 10. Sự khác biệt giữa hai bản đồ
- 11. Sự khác biệt giữa tìm và lọc
- 12. sự khác biệt giữa hai biến SYSTEMTIME
- 13. Sự khác biệt giữa hai DateTimes C#?
- 14. C# - Sự khác biệt giữa hai ngày?
- 15. tìm sự khác biệt giữa 2 chi nhánh từ xa
- 16. Công cụ khác biệt dữ liệu để tìm sự khác biệt giữa hai Tệp MDB Access
- 17. Sự khác biệt số nguyên trong python giữa hai ngày
- 18. Sự khác biệt thực sự giữa từ điển và bảng băm là gì?
- 19. Sự khác nhau giữa từ điển và mảng là gì?
- 20. cách tìm sự khác biệt giữa năm và tháng giữa hai ngày?
- 21. Sự khác biệt giữa hai trường hợp cùng một lớp
- 22. Tìm từ khác nhau giữa hai chuỗi
- 23. sự khác biệt giữa băm của perl và từ điển python
- 24. sự khác biệt giữa nội dung của hai thư mục
- 25. Sự khác biệt giữa = và: =
- 26. Sự khác biệt PHP trong tháng giữa hai ngày?
- 27. Tìm sự khác nhau giữa hai bảng lớn trong PostgreSQL
- 28. Tìm sự khác biệt giữa các chuỗi trong Ruby
- 29. Sự khác biệt giữa $ (...) và `...`
- 30. Làm thế nào để tìm sự khác biệt giữa hai dây?
Bạn có thể sử dụng 'AsEnumerable' để "chuyển đổi" từ điển của bạn thành một 'IEnumerable', và sau đó sử dụng giải pháp được đề xuất trong câu hỏi được liên kết. Vì KeyValuePair là một cấu trúc, nên so sánh theo giá trị. –
Heinzi
Bạn không cần 'AsEnumerable', vì điều đó hoàn toàn không có chuyển đổi. Nó chỉ là một phương thức tiện lợi để giới hạn các phương thức intellisense thành các phần mở rộng 'IEnumerable' cũng như cho phép sử dụng các phần mở rộng 'IEnumerable ' trên các đối tượng cũng thực hiện 'IQueryable ' mà không cần phải cast. –
Nuffin
'dic1.Except (x => dic2.Contains (x)) Liên minh (dic2.Except (x => dic1.Contais (X));', bạn có muốn phương pháp tốt hơn không? –