2010-07-15 29 views
8

Tôi đang cố định vị trí tất cả các khóa trong một Từ điển không có trong một Từ điển khác. Rõ ràng, tôi có thể làm điều này bằng cách sử dụng một vòng lặp lồng nhau, nhưng tôi đang cố gắng tìm hiểu LINQ vào lúc này và tôi đã tự hỏi nếu tôi có thể sử dụng nó để thực hiện nhiệm vụ này?Sử dụng LINQ để tìm tất cả các khóa từ một bộ sưu tập không có trong bộ sưu tập khác?

Dưới đây là những gì tôi có cho đến nay:

Dictionary<string, List<string>> DBtables = this.CollectTableListings(); 
var generic = from Dictionary<string,List<string>> tab 
       in DBtables 
       where !_tables.ContainsKey(???) 
       select tab; 

Bất kỳ ý kiến ​​gì nên đi ở vị trí của dấu hỏi (hoặc có lẽ thay vì toàn bộ mệnh đề where)?

+0

Là một lưu ý, không có cần phải xác định loại trước khi "tab" trong mã bạn được đăng. – Kirk

Trả lời

11

Bạn có thể làm:

var resultKeys = DBTables.Keys.Except(_tables.Keys); 

Phương pháp Except() là cơ bản giống như các minus hoạt động trong SQL - nó trả về tất cả các mặt hàng từ bộ sưu tập đầu tiên trừ trong lần thứ hai. Vì từ điển lộ ra chìa khóa của chúng, bạn có thể tính toán sự khác biệt của chúng theo cách đó.

Toán tử Except() sử dụng tính bình đẳng mặc định cho loại, nhưng cũng có quá tải cho phép bạn chỉ định IEqualityComparer của riêng bạn để ghi đè ngữ nghĩa về cách so sánh các giá trị. Trong ví dụ của bạn, có thể bạn không cần điều đó - nhưng thật tuyệt khi biết điều đó ở đó.

+4

Xin lưu ý, 'Ngoại trừ()' Trả về ** Kết quả ** khác biệt. Trong khi đó có thể được mong muốn trong ví dụ này, nó đáng chú ý để sử dụng trong các triển khai khác. – Aren

+0

@Aren B: Đúng, nhưng trong trường hợp của một từ điển 'Dictionary <>', các khóa này đã được bảo đảm là khác biệt. – LBushkin

+1

Tôi biết, Đó là lý do tại sao tôi đã nói rằng ví dụ này là mong muốn. Nhưng ai đó có thể vấp ngã khi chủ đề này tìm kiếm một * Danh sách trừ * và nghĩ rằng 'Ngoại trừ() 'có thể giải quyết vấn đề của họ. Do đó tại sao tôi nói nó đáng chú ý. – Aren

2
Dictionary<string, List<string>> dictOne = ... 
Dictionary<string, List<string>> dictTwo = ... 

var missingKeys = dictOne.Keys.Where(x => !dictTwo.ContainsKey(x)); 
1
Dictionary<string, List<string>> dictionary = this.CollectTableListings(); 
Dictionary<string, List<string>> otherDictionary = getOtherTable(); 

var keys = from key in dictionary.Keys 
      where !otherDictionary.Keys.Contains(key) 
      select key; 

(Nhưng câu trả lời LBuskin là tốt hơn nhiều)

0

có một cái nhìn tại các phương pháp Except mở rộng. HTH.

0

Nếu bạn muốn sử dụng cú pháp truy vấn tôi sẽ làm một cái gì đó tương tự như dưới đây:

var keys = from d1 in dictionary1 
      select d1.Key; 
var items = from d2 in dictionary2 
      where d2.Key in keys 
      select d2; 
foreach(var item in items) 
{ 
} 
Các vấn đề liên quan