2013-03-27 37 views
5

之间的区别我的GUID 2名单为:如何找到2个IEnumerable的对象

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

的用户ID和lsCheckedUsers列表是从SQL数据库采用短小精悍的填充。

我现在想查找所有不在lsCheckedUsers中的userid。

我曾尝试以下

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

以上都不是实际收益的2

如何获得不中都存在的GUID的差异之间的差异。

我确信,lsCheckedUsers具有在用户ID的GUID

+2

'!lsCheckedUsers.Contains(lsCheckedUsers)'是一个非常有趣的声明 - 将会是常量('false'我认为)... – 2013-03-27 18:21:28

+5

是否有一个原因,您使用IEnumerable 而不是' IEnumerable '? – itsme86 2013-03-27 18:24:36

回答

9

这是正确的:

var userdifference = userids.Except(lsCheckedUsers);

如果同时你IEnumerable<dynamic>实际上包含Guids它将工作。打印或检查每个项目,以确保它们是Guids

如果这是您所期望的,您应该确实使用IEnumerable<Guid>并将传入的项目转换为Guids。它会希望能够防止你可能看到的错误。

+0

当使用动态对象时,比较不能按照应有的方式工作。我改变了实际的Guid类型,并工作 – user1526912 2013-03-28 17:34:18

+0

@ user1526912:嗯,有趣。如果内部类型实际上是“Guids”,它肯定应该用'动态'。我用'IEnumerable '和'IEnumerable '测试了它(简单测试 - 几个'List '带有一些匹配和不匹配的'Guids')。我想知道你是否将他们选为'Guids'做了某种内部转换...... – 2013-03-28 22:00:17

1

您有:

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

但我认为你的意思是:

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

更新:

给大家打分这些答案因为“参考”比较,认为Guid是一种值类型,因此其平等的评估方式不同。试试这个简单的测试来说服你自己:

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

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

你会看到结果是True。

+0

只有当它们是相同的参考时它才会起作用。这两个列表都从数据库填充。 – 2013-03-27 18:32:55

+0

@VitorCanova这通常是真的,但Guid是一个结构,它的相等性以不同的方式进行评估。尝试一下,看看。 – itsme86 2013-03-27 18:45:27

+0

对不起。没有注意到这一点。你为什么使用动态? – 2013-03-27 19:29:35

2

东西沿着这些线路..

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

好的ans ....经典的方法.. !!!! :P – 2014-07-07 09:37:19

相关问题