2012-08-15 57 views
6

Tôi không thể tìm thấy ví dụ cụ thể về điều này, vì vậy, hãy đăng câu hỏi. Bất kỳ trợ giúp nào được đánh giá cao.So sánh hai danh sách chung chung lớn

Tôi có hai danh sách chung chung lớn, cả hai đều có hơn 300 nghìn mục.

Tôi đang vòng qua danh sách đầu tiên để lấy lại thông tin và tạo mục mới cho danh sách mới, nhưng tôi cần phải tìm kiếm trong danh sách thứ hai và trả lại giá trị dựa trên BA tiêu chí phù hợp để thêm vào danh sách, tuy nhiên như bạn có thể tưởng tượng, làm 300k * 300k lần này là dành thời gian.

Có cách nào để tôi có thể thực hiện việc này hiệu quả hơn không?

Mã của tôi:

var reportList = new List<StocksHeldInCustody>(); 
foreach (var correctDepotHolding in correctDepotHoldings) 
    { 
    var reportLine = new StocksHeldInCustody(); 
    reportLine.ClientNo = correctDepotHolding.ClientNo; 
    reportLine.Value = correctDepotHolding.ValueOfStock; 
    reportLine.Depot = correctDepotHolding.Depot; 
    reportLine.SEDOL = correctDepotHolding.StockCode; 
    reportLine.Units = correctDepotHolding.QuantityHeld; 
    reportLine.Custodian = "Unknown"; 
    reportLine.StockName = correctDepotHolding.StockR1.Trim() + " " + correctDepotHolding.StockR2.Trim(); 

    //Get custodian info 

    foreach (var ccHolding in ccHoldList) 
    { 
     if (correctDepotHolding.ClientNo != ccHolding.ClientNo) continue; 
     if (correctDepotHolding.Depot != ccHolding.Depot) continue; 
     if (correctDepotHolding.StockCode != ccHolding.StockCode) continue; 
     if (correctDepotHolding.QuantityHeld != ccHolding.QuantityHeld) continue; 
     reportLine.Custodian = ccHolding.Custodian; 
     break; 
    } 
    reportList.Add(reportLine); 
    } 
+0

tạo một hash của tất cả các vars với nhau trong đối tượng và chỉ kiểm tra này, nó phải chạy nhanh sau đó – EaterOfCode

+1

Nguồn dữ liệu là gì? Nếu nó là một cơ sở dữ liệu phong nha, điều này có thể được thực hiện tốt hơn bên đó. –

+0

Cập nhật câu trả lời chung của tôi với các chi tiết về cách thực hiện phép nối ngoài trong linq – Arkiliknam

Trả lời

5

Như Pranay nói, một tham gia có lẽ là những gì bạn muốn:

var query = from correct in correctDepotHoldings 
      join ccHolding in ccHoldList 
       on new { correct.ClientNo, correct.Depot, 
         correct.StockCode, correct.QuantityHeld } 
       equals new { ccHolding.ClientNo, ccHolding.Depot, 
          ccHolding.StockCode, ccHolding.QuantityHeld } 
      // TODO: Fill in the properties here based on correct and ccHolding 
      select new StocksHeldInCustody { ... }; 
var reportList = query.ToList(); 
+0

Xin chào, im nhận được lỗi trên từ khóa "bằng" và "ccHolding", tôi có cần khai báo biến này trước khi sử dụng không? –

+0

@DavidJohnson: Rất tiếc, đã quên phần "trong". Xem chỉnh sửa của tôi - và nếu bạn mới sử dụng LINQ, tôi sẽ dành chút thời gian để học nó hoàn toàn. –

+0

Cảm ơn bạn- Tôi đang cố gắng nhưng có vẻ như một số nếu nó chỉ được tạo ngẫu nhiên mà không có hoa văn, tôi đoán nó chỉ là một trường hợp học hỏi tìm hiểu !! Cảm ơn một lần nữa. –

3

Bạn có thể di chuyển dữ liệu từ danh sách tra cứu vào một cuốn từ điển, với chìa khóa là một hash độc đáo của 3 mục mà bạn đang tìm kiếm trên. Sau đó, bạn sẽ có tra cứu rất nhanh và lưu hàng triệu lần lặp lại.

3

Kiểm tra bài đầy đủ của tôi: Linq Join on Mutiple columns using Anonymous type

Make sử dụng LINQ bên tham gia sẽ làm việc cho bạn.

var list = (from x in entity 
      join y in entity2 
      on new { x.field1, x.field2 } 
     equals new { y.field1, y.field2 } 
     select new entity { fields to select}).ToList(); 

Tham gia của LINQ trên nhiều lĩnh vực

enter image description here

EmployeeDataContext edb= new EmployeeDataContext(); 
var cust = from c in edb.Customers 
      join d in edb.Distributors on 
      new { CityID = c.CityId, StateID = c.StateId, CountryID = c.CountryId, 
        Id = c.DistributorId } 
      equals 
      new { CityID = d.CityId, StateID = d.StateId, CountryID = d.CountryId, 
        Id = d.DistributorId } 
      select c; 
+0

Cú pháp nối đó không hợp lệ. Xem câu trả lời của tôi cho một ví dụ chính xác. –

+1

@JonSkeet - chỉ cần cập nhật ....... thanks sir –

1

Sử dụng LINQ để gia nhập danh sách và gửi lại như thế nào bạn muốn.

ví dụ

var list1 = GetMassiveList(); 
var list2 = GetMassiveList(); 

var list3 = from a in list1 
      join b in list2 
       on new { a.Prop1, a.Prop2 } equals 
        new { b.Prop1, b.Prop2 } 
      select new { a.Prop1, b.Prop2 }; 

Để làm outter bạn tham gia, bạn có thể sử dụng DefaultIfEmpty() Ví dụ này là thiết lập một phần QUYỀN bạn của kết nối đến một đối tượng mặc định (thường null) cho trường hợp tham gia wasn không được thực hiện.

ví dụ

from a in list1 
join b in list2 
    on new { a.Prop1, a.Prop2 } equals 
     new { b.Prop1, b.Prop2 } 
into outer 
from b in outer.DefaultIfEmpty() 
select new 
    Prop1 = a.Prop1, 
    Prop2 = b != null ? b.Prop2 : "Value for Prop2 if the b join is null" 
} 
Các vấn đề liên quan