2012-01-13 33 views
11

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

+0

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

+1

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

+2

'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? –

Trả lời

21
var diff = dicOne.Except(dicTwo).Concat(dicTwo.Except(dicOne)); 
+1

phương pháp này chỉ so sánh các phím? –

+2

@ bto.rdz Không, cả khóa và giá trị. – Magnus

+0

Tuyệt vời nhưng đừng quên kiểm tra 'null' –

0

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)); 
+2

Không chỉ bao gồm các phần tử đó trong' dictTwo' nhưng không có trong 'dictOne'. –

1

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; 
      } 
     } 
    } 
Các vấn đề liên quan