如何找到2个IEnumerable对象之间的区别

时间:2013-03-27 18:17:33

标签: c# .net

我有2个guid列表:

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

使用dapper从SQL数据库填充userids和lsCheckedUsers列表。

我现在希望找到不在lsCheckedUsers中的所有用户ID。

我试过以下

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

以上所有实际都不会返回2之间的差异。

如何获得两者中不存在的guid的区别。

我确信lsCheckedUsers具有位于用户标识中的Guid

4 个答案:

答案 0 :(得分:9)

这是正确的:

var userdifference = userids.Except(lsCheckedUsers);

如果您的IEnumerable<dynamic>实际上都包含Guids,则会有效。打印或检查每个中的项目以确保它们是Guids

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

答案 1 :(得分:2)

沿着这些方向的东西..

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

答案 2 :(得分: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。

答案 3 :(得分:1)

Enumerable有一个Except方法

Enumerable.Except Method (IEnumerable, IEnumerable)

并使用String或GUID 它将比较equals的值。

HashSet ExceptWith可能会有更好的表现 但是如果需要允许重复,则无法使用HashSet。

HashSet.ExceptWith Method