2013-03-27 4 views
5

У меня есть 2 списка GUIDs как:Как найти разницу между 2 IEnumerable объектами

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

UserIds и lsCheckedUsers список заполняется из базы данных SQL с помощью щеголеватой.

Теперь я хочу найти всех пользователей, которые не находятся в lsCheckedUsers.

Я попробовал следующее

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

Ни один из указанных выше фактических доходов разница между 2.

Как я могу получить разницу GUIDs, которые не существуют в обоих.

Я уверен, что lsCheckedUsers имеет Guids, которые находятся в идентификаторами пользователей

+2

'lsCheckedUsers.Contains (lsCheckedUsers)' является примечание очень интересное заявление - будет постоянным ('false' я думаю) все время ... –

+5

Есть ли причина, что вы используете' 'IEnumerable вместо' IEnumerable '? – itsme86

ответ

9

Это правильно:

var userdifference = userids.Except(lsCheckedUsers);

Это будет работать, если оба ваших IEnumerable<dynamic> на самом деле содержат Guids. Распечатайте или проверьте элементы в каждом, чтобы убедиться, что они Guids.

Вы действительно должны использовать IEnumerable<Guid> и набрасывать входящие товары на Guids, если это то, что вы ожидаете. Он надеется предотвратить ошибки, подобные тем, которые вы потенциально видите.!

+0

При использовании динамических объектов сравнение не работает так, как должно было. Я изменил типы на фактический Guid и работал – user1526912

+0

@ user1526912: Хммм, интересно. Он должен определенно работать как «динамический», если внутренние типы на самом деле «Гиды». Я протестировал его с помощью 'IEnumerable ' и 'IEnumerable ' (простые тесты - пара «Список ' с добавлением некоторых совпадающих и не соответствующих «Guids»). Я задаюсь вопросом, выполнило ли ваше литье их в «Гиды» какое-то внутреннее преобразование ... –

1

У вас есть:

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

Но я думаю, что вы имеете в виду:

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

Update:

Каждому, кто отмечает эти ответы из-за «ссылочные» сравнения, считайте, что Guid является типом значений, поэтому его равенство оценивается по-разному. Попробуйте этот простой тест, чтобы убедить себя:

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

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

Вы увидите, что результатом является True.

+0

Он будет работать только в том случае, если они являются одинаковыми. Оба списка заполняются из базы данных. –

+0

@VitorCanova Это обычно верно, но Guid - это структура, и ее равенство оценивается по-другому. Попробуйте сами и посмотрите. – itsme86

+0

Извините. Не замечал этого. Почему вы используете динамический? –

2

Что-то вдоль этих линий ..

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

Nice ans .... Классический подход .. !!!! : P –

1

перечислимых имеет исключением метода

Enumerable.Except Method (IEnumerable, IEnumerable)

и использовать строки или GUID.
Он будет сравнивать значения для equals.

HashSet ExceptWith, вероятно, будет иметь лучшую производительность.
Но нельзя использовать HashSet, если вам нужно разрешить дубликаты.

HashSet.ExceptWith Method

Смежные вопросы