2013-03-27 24 views
5

tôi có 2 danh sách các guids như:Làm thế nào để tìm thấy sự khác biệt giữa 2 đối tượng IEnumerable

IEnumerable<dynamic> userids = null; 
IEnumerable<dynamic> lsCheckedUsers = null; 

Các userids và lsCheckedUsers danh sách được dân cư từ một cơ sở dữ liệu SQL sử dụng đoan trang.

Bây giờ tôi muốn tìm tất cả các userids không có trong lsCheckedUsers.

Tôi đã thử những điều sau

var userdifference = userids.Where(i => !lsCheckedUsers.Contains(lsCheckedUsers)); 
var userdifference = userids.Except(lsCheckedUsers); 

Không ai trong số lợi nhuận thực tế trên phần chênh lệch giữa 2.

Làm thế nào để tôi nhận được sự khác biệt của guids không tồn tại trong cả hai.

Tôi chắc chắn rằng lsCheckedUsers có Guids có trong userids

+2

'! LsCheckedUsers.Contains (lsCheckedUsers)' là lưu ý rất thú vị tuyên bố - sẽ là hằng số ('false' tôi nghĩ) tất cả các thời gian ... –

+5

Có một lý do bạn đang sử dụng' IEnumerable 'thay vì' IEnumerable '? – itsme86

Trả lời

9

này là đúng:

var userdifference = userids.Except(lsCheckedUsers);

Nó sẽ làm việc nếu cả hai IEnumerable<dynamic> của bạn thực sự chứa Guids. In ra hoặc kiểm tra các mục trong mỗi mục để đảm bảo chúng là Guids.

Bạn thực sự nên sử dụng IEnumerable<Guid> và truyền các mục đến tới Guids nếu đây là những gì bạn đang mong đợi. Nó hy vọng sẽ ngăn chặn các lỗi như một trong những bạn có khả năng nhìn thấy.

+0

Khi sử dụng các đối tượng động, so sánh không hoạt động như mong muốn. Tôi đã thay đổi các loại thành Guid thực tế và đã làm việc – user1526912

+0

@ user1526912: Hmmm, thú vị. Nó chắc chắn sẽ hoạt động như 'động' nếu các kiểu nội bộ nằm trong thực tế' Guids'. Tôi đã thử nghiệm nó với 'IEnumerable 'và' IEnumerable ' (các kiểm tra đơn giản - một vài 'Danh sách ' với một số 'Kết quả phù hợp 'không phù hợp và không phù hợp). Tôi tự hỏi nếu bạn đúc chúng vào 'Guids' đã làm một số loại chuyển đổi nội bộ ... –

1

Bạn có:

var userdifference = userids.Where(i => !lsCheckedUsers.Contains(lsCheckedUsers)); 

Nhưng tôi nghĩ bạn có nghĩa là:

var userdifference = userids.Where(i => !lsCheckedUsers.Contains(i)); 

Cập nhật:

Để mọi người đánh dấu những câu trả lời này vì "so sánh" so sánh, xem xét rằng Guid là một loại giá trị để bình đẳng của nó được đánh giá khác nhau. Hãy thử bài kiểm tra đơn giản này để thuyết phục bản thân:

var guid = Guid.NewGuid(); 
var guids = new[] { new Guid(guid.ToString()) }; 

Console.WriteLine(guids.Contains(guid)); 

Bạn sẽ thấy kết quả là True.

+0

Nó sẽ chỉ hoạt động nếu chúng là cùng một tham chiếu. Cả hai danh sách đều được điền từ cơ sở dữ liệu. –

+0

@VitorCanova Điều đó thường là đúng, nhưng Guid là một cấu trúc và bình đẳng của nó được đánh giá theo một cách khác. Hãy thử nó cho chính mình và nhìn thấy. – itsme86

+0

Xin lỗi. Không nhận ra điều đó. Tại sao bạn sử dụng năng động? –

2

Something dọc theo những đường ..

var difference = list1.Where (e => !list2.Any(a => a == e)) 
+0

Đẹp ans .... Cách tiếp cận cổ điển .. !!!! : P –

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