2013-05-08 30 views
5

Cách nhanh nhất và tốt nhất để so sánh 2 danh sách và trả về kết quả trùng khớp là gì. Chỉ có một kết quả phù hợp. List1 chứa dữ liệu động từ cơ sở dữ liệu.So sánh Danh sách và trả về các kết quả phù hợp trong C#

Cách tôi làm điều đó bây giờ:

foreach (var item1 in List1) 
{ 
    foreach (var item2 in List2) 
    { 
     if(item2 == item1) 
     string match = item1; 
    } 
} 

tôi có cảm giác như nó có thể được thực hiện nhanh hơn rất nhiều.

Trả lời

11

Sử dụng Enumerable.Intersect.

var matchItem = List1.Intersect(List2).First(); 

Không thực sự chắc chắn mã nhanh hiện tại của bạn nhanh hơn bao nhiêu, bạn có thể đo lường bằng cách sử dụng Đồng hồ bấm giờ. Nhưng trong mã hiện tại của bạn, bạn nên phá vỡ bên trong của bạn cũng như vòng lặp bên ngoài về việc tìm kiếm các trận đấu. Một cái gì đó như:

foreach (var item1 in List1) 
{ 
    string match = null; 
    foreach (var item2 in List2) 
    { 
     if (item2 == item1) 
     { 
      match = item1; 
      break; 
     } 
    } 
    if (match != null) 
     break; 
} 
+1

tôi sẽ kiểm tra nếu nó hoạt động – Bernardmoes

+0

@Habib, là nó nhanh hơn hoặc ngắn gọn? tôi có nghĩa là nó làm nội bộ làm cùng một lopping? – tariq

+0

@tariq, có nó không looping nội bộ, tôi không chắc chắn nếu nó s nhanh hơn, đó là lý do tại sao tôi cung cấp các tùy chọn khác với mã sửa đổi từ câu hỏi. – Habib

2

Bạn có nhiều cách để thực hiện việc này. Nó chủ yếu phụ thuộc vào dữ liệu bạn đang cố gắng để phù hợp.

  • Điều đầu tiên bạn có thể làm là có một danh sách được sắp xếp
  • sau đó nếu bạn biết giá trị giữa danh sách, bạn có thể lặp qua danh sách của bạn từ đầu từ cuối
  • nhưng chủ yếu chỉ trả lại của bạn giá trị vì bạn đã tìm thấy nó

cũng là 2 điểm đầu tiên sẽ chỉ hoạt động nếu danh sách của bạn có giá trị số mà bạn có thể dựa vào để xác định mục.

Việc tối ưu hóa đầu tiên bạn có thể làm là:

Foreach (var item1 in List1) 
{ 
    Foreach (var item2 in List2) 
    { 
     if(item2 == item1) return item1; 
    } 
} 

Nếu bạn thực sự cần thói quen này là rất nhanh chóng, bạn sẽ phải làm việc tối ưu dựa trên các dữ liệu đó là trong danh sách của bạn.

Ngoài ra nếu dữ liệu của bạn là string trong cả hai danh sách, bạn có thể tạo mã băm cho mỗi chuỗi (string.GetHashCode) và sau đó dựa vào mã số để sắp xếp và tìm kiếm trong danh sách của bạn.

Có rất nhiều cách khác, nhưng tất cả phụ thuộc vào:

  • số lượng dữ liệu bạn có trong danh sách của bạn (nếu bạn chỉ có 100 yếu tố bạn sẽ không thấy nhiều lợi ích hiệu năng)
  • nếu danh sách của bạn là tĩnh hoặc động
  • mức độ thường xuyên họ có thể thay đổi nếu họ năng động
  • bao lâu thì bạn thực hiện một tìm kiếm trong các danh sách này
  • ...
1

Bạn có thể đoản mạch các vòng khi bạn tìm thấy bất kỳ kết quả phù hợp nào. Sau đó bạn có thể sử dụng một phương thức trả về mục phù hợp với, hoặc null nếu không phù hợp (giả định các yếu tố này là tài liệu tham khảo loại):

foreach (var item1 in List1) 
    foreach (var item2 in List2) 
     if (item2 == item1) 
      return item1; 

return null; 
Các vấn đề liên quan