2013-04-22 24 views
5

Tôi có một cuốn từ điển mà chính là một Id và giá trị là một chuỗiC# có phương thức ContainsAny() cho từ điển không?

bây giờ tôi có một danh sách của người đối tượng trong đó mỗi người đều có một tài sản CarIds đó là một

IEnumerable<int> 

Tôi muốn về cơ bản lọc danh sách các đối tượng để chỉ bao gồm các mục mà một trong các thuộc tính được bao gồm trong dict.

Ví dụ: một cái gì đó như thế này:

var dictionary = GetDict(); 

var people = GetPeople(); 

people = people.Where(r => dictionary.ContainsAny(r.CarIds)).ToList(); 

Có một cái gì đó như thế này tồn tại nơi tôi có thể làm điều gì đó tương tự như containsKey() nhưng kiểm tra cho bất kỳ trong danh sách các ints?

+0

pedantic: C# thậm chí không có từ điển, ít hơn nhiều phương pháp như ContainsAny. .NET có từ điển và có thể có một phương thức như vậy. –

Trả lời

5

Vâng, bạn có thể thử này cho các danh sách:

people = people.Where(r => list.Intersect(r.CarIds).Count() != 0).ToList(); 

Đối với từ điển, bạn có thể sử dụng này:

people = people.Where(r => r.CarIds.Any(n => dictionary.ContainsKey(n))).ToList(); 
+0

cảm ơn. một tinh chỉnh vì nó trông giống như tôi cần list.Keys.Intersect đưa ra một từ điển – leora

+0

@leora Hãy thử cập nhật, nó sẽ hoạt động nhanh hơn 'Intersect'. – dasblinkenlight

+0

tôi không làm theo câu trả lời cập nhật của bạn nó có vẻ là trở lại bool nhưng bạn đang làm một! = 0 kiểm tra. . – leora

6

đặt cược tốt nhất của bạn có lẽ là để mở rộng từ điển (mà có lẽ phải có một ContainsAny() hoặc ContainsAnyKey()).

public static bool ContainsAny<K, V>(
     this Dictionary<K, V> dict, IEnumerable<K> keys) 
{ 
    foreach(K key in keys) 
     if(dict.ContainsKey(key)) return true; 
    return false; 
} 

và điều này có thể được linq'd như:

public static bool ContainsAny<K, V>(
      this Dictionary<K, V> dict, IEnumerable<K> keys) 
    { return keys.Any(key => dict.ContainsKey(key)); } 
Các vấn đề liên quan