2012-01-26 39 views
14

Tôi có hai đối tượng:LINQ truy vấn giữa hai danh sách các đối tượng

ObjectA 
{ 
    string code; 
    string country; 
} 

ObjectB 
{ 
    string code; 
    string otherstuff; 
} 

Và tôi có List<objectA>List<ObjectB> và tôi cần phải tìm tất cả các đối tượng trong List<ObjectB> chứa objectA.Code. Nhưng không thể quản lý để triển khai nó trên truy vấn LINQ.

+2

1. Bạn có duy nhất 'đối tượngA' hoặc bạn cần nó cho tất cả các đối tượng từ' Danh sách '. 2. Bố cục kết quả bạn mong đợi là gì? 3. Bạn đã thử những gì cho đến nay? – Krizz

+0

Bạn cũng có thể xem IEnumerable.Intersect: http://msdn.microsoft.com/en-us/library/bb460136.aspx Bạn cần ghi đè 'Equals' và' GetHashCode' trong cả hai và cho phép so sánh với nhau qua 'Mã'. –

Trả lời

29

Có vẻ như bạn đang cố gắng tìm tất cả các phiên bản ObjectB có giá trị code trong bất kỳ giá trị List<ObjectA> nào. Nếu vậy hãy thử như sau

List<ObjectA> listA = ...; 
List<ObjectB> listB = ...; 
var all = listB.Where(b => listA.Any(a => a.code == b.code)); 
6

Để làm điều này một cách hiệu quả đầu tiên bạn có thể đặt mã vào một HashSet<string> và sau đó sử dụng một truy vấn Contains() để kiểm tra xem B trong câu hỏi có một mã được chứa trong HashSet:

var codes = new HashSet<string>(listOfAs.Select(x => x.code)); 
var selectedBs = listOfBs.Where(x=> codes.Contains(x.code)); 
14

Có vẻ như bạn muốn tham gia danh sách ObjectA với danh sách ObjectB trên thuộc tính code. Đây là một cách:

List<ObjectA> listOfA = ...; 
List<ObjectB> listOfB = ...; 
var all = from a in listOfA 
      join b in listOfB on a.code equals b.code 
      select new {a,b}; 

Kết quả là một danh sách các đối tượng ẩn danh, có chứa 2 thuộc tính: một loại ObjectA, b của loại ObjectB, với cùng code

5

Tôi sẽ đưa mã của ObjectA danh sách vào một HashSet, nếu không truy vấn của bạn sẽ trở thành một hoạt động O (n). Như thế này là một hoạt động O (n):

var aList = new List<ObjectA>(); 
var bList = new List<ObjectB>(); 

var aCodes = new HashSet<string>(aList.Select(a => a.code)); 
var result = bList.Where(b => aCodes.Contains(b.code)); 
+0

Cảm ơn Olivier. Bạn có biết bất kỳ hướng dẫn hay trong linq hoặc sách với các ví dụ về tốc độ và vv không? – Reno

+2

Đối với LINQ Google [LINQ hướng dẫn C#] (http://www.google.com/search?q=LINQ+tutorial+C%23). Đối với tốc độ, những gì có liên quan ở đây, là có một kiến ​​thức cơ bản về các loại bộ sưu tập khác nhau cùng với ưu và nhược điểm của chúng. James Michael Hare cho một cái nhìn tổng quan tốt ở đây: [Chọn lớp sưu tập phù hợp] (http://geekswithblogs.net/BlackRabbitCoder/archive/2011/06/16/c.net-fundamentals-choosing-the-right-collection-class .aspx) –

Các vấn đề liên quan