2013-03-27 17 views
5

mam 2 Wykaz GUID jako:Jak znaleźć różnicy między 2 IEnumerable obiektów

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

Lista ID użytkownika i lsCheckedUsers są wypełniane z bazy danych SQL przy użyciu elegancki.

Chciałbym teraz znaleźć wszystkich użytkowników, którzy nie są w lsCheckedUsers.

Próbowałem następujące

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

żadna z powyższych rzeczywistych zwraca różnicę między 2.

Jak uzyskać różnicę GUID, które nie istnieją w obu.

Jestem pewien, że lsCheckedUsers ma GUID, które są w użytkownicy o identyfikatorach

+2

'lsCheckedUsers.Contains (lsCheckedUsers)' jest bardzo interesująca notatka oświadczenie - będzie stała ('FALSE myślę) cały czas ... –

+5

Czy istnieje powód używasz' IEnumerable 'zamiast' IEnumerable '? – itsme86

Odpowiedz

9

To jest poprawne:

var userdifference = userids.Except(lsCheckedUsers);

To zadziała wtedy, gdy oba swoimi IEnumerable<dynamic> faktycznie zawierają Guids. Wydrukuj lub sprawdź elementy w każdym z nich, aby upewnić się, że są one Guids.

Naprawdę powinieneś używać IEnumerable<Guid> i przesyłać przychodzące przedmioty do Guids, jeśli tego właśnie oczekujesz. Miejmy nadzieję, że zapobiegnie to błędom podobnym do potencjalnego.

+0

Podczas korzystania z obiektów dynamicznych porównanie nie działało tak jak powinno. Zmieniłem typy na rzeczywiste Guid i to działało – user1526912

+0

@ user1526912: Hmmm, interesujące. Powinno to zdecydowanie działać jako 'dynamiczne' jeśli wewnętrzne typy są w rzeczywistości' Guidami'. Przetestowałem to z 'IEnumerable ' i 'IEnumerable ' (proste testy - kilka 'List ' z niektórymi pasującymi i niekompatybilnymi 'Guids' dodanymi). Zastanawiam się, czy twoje rzucenie ich na "Guidy" dokonało jakiejś wewnętrznej konwersji ... –

1

Masz:

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

Ale myślę, że chodziło Ci o:

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

Aktualizacja:

Wszystkim, którzy zaznaczają te odpowiedzi z powodu porównania "referencyjne" uważają, że Guid jest typem wartości, więc jego równość jest oceniana w różny sposób. Wypróbuj ten prosty test, aby przekonać się:

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

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

Zobaczysz, że wynik jest prawdziwy.

+0

Będzie działać tylko wtedy, gdy będą to te same odwołania. Obie listy są wypełniane z bazy danych. –

+0

@VitorCanova Zwykle byłaby to prawda, ale Guid jest strukturą, a jej równość jest oceniana w inny sposób. Wypróbuj go dla siebie i zobacz. – itsme86

+0

Przepraszamy. Tego nie zauważyłem. Dlaczego używasz dynamicznego? –

2

Coś wzdłuż tych linii ..

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

Nice ans .... Klasyczne podejście .. !!!! : P –

Powiązane problemy