2010-01-13 39 views
13

Tôi có một danh sách lớn (~ 110.000 chuỗi), mà tôi cần so sánh với một danh sách có kích thước tương tự.Cách tốt nhất để so sánh hai danh sách chuỗi lớn, sử dụng C# và LINQ?

Danh sách A đến từ 1 hệ thống. Danh sách B đến từ bảng SQL (tôi chỉ có thể đọc, không có procs được lưu trữ, v.v.)

Cách tốt nhất để tìm giá trị nào trong danh sách A, không còn tồn tại trong danh sách B nữa?

Có phải 100.000 chuỗi là số lớn được xử lý trong một mảng không?

nhờ

+0

Khi bạn nói danh sách b đến từ bảng sql, điều này có nghĩa là danh sách b được tải vào bộ nhớ, hoặc nó giống như tập dữ liệu bộ đọc sql mà bạn chỉ có thể xem một mục tại một thời điểm? – kemiller2002

+0

Bạn đang sử dụng LINQ to SQL cho danh sách của mình b? –

+0

Tôi đang sử dụng một tableadapter, vì vậy nó nằm trong bộ nhớ cho dữ liệu bảng SQL (Danh sách B). Danh sách A Tôi đã đọc vào một ArrayList, nhưng có thể sử dụng Danh sách . – Donaldinio

Trả lời

26

Vì vậy, bạn có hai danh sách như sau:

List<string> listA; 
List<string> listB; 

Sau đó sử dụng Enumerable.Except:

List<string> except = listA.Except(listB).ToList(); 

Lưu ý rằng nếu bạn muốn, ví dụ, ignore case:

List<string> except = listA.Except(listB, StringComparer.OrdinalIgnoreCase).ToList(); 

Bạn có thể thay thế thông số cuối cùng bằng số IEqualityComparer<string> bạn chọn.

1

Ăn cắp từ this question, có vẻ như bạn có thể sử dụng phương pháp Except<T>().

9

Với LINQ:

var missing = listA.Except(listB).ToList(); 
+0

Rất đẹp. Tương tự như thế này: http://msdn.microsoft.com/en-us/library/bb397894.aspx Tôi không được sử dụng để xử lý các tập dữ liệu lớn, vì vậy có thể dễ dàng xử lý 100.000 theo cách này? – Donaldinio

+0

Chắc chắn; và nếu nó không phải là, bạn sẽ phải làm việc tại db, vì vậy C# là ra anyway ;-p –

2
List<string> A = //get from file 
List<string> B = //get from db 

var C = A.Except(B); 
5

Ra quan tâm, làm bạn phải sử dụng List<string>? Vì trong .net 3.5 SP1, bạn có thể sử dụng HashSet và phương thức đó là ExceptWith. Theo hiểu biết của tôi, HashSets được tối ưu hóa đặc biệt để so sánh giữa hai Bộ.

+0

Không cần phải sử dụng Danh sách . Tôi sẽ xem xét HashSet. Cảm ơn! – Donaldinio

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