我有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
答案 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。