如何找到两个IEnumerable对象之间的差异
本文关键字:对象 IEnumerable 之间 两个 何找 | 更新日期: 2023-09-27 18:06:24
我有2个指南列表:
IEnumerable<dynamic> userids = null;
IEnumerable<dynamic> lsCheckedUsers = null;
userid和lsCheckedUsers列表使用dapper从SQL数据库中填充。
我现在希望找到所有不在lsCheckedUsers中的userid。
我已经尝试了以下
var userdifference = userids.Where(i => !lsCheckedUsers.Contains(lsCheckedUsers));
var userdifference = userids.Except(lsCheckedUsers);
以上都不返回两个值的差值。
如何获取两者中不存在的指针的差异?
我确定lsCheckedUsers有在userids
这是正确的:
var userdifference = userids.Except(lsCheckedUsers);
如果你的IEnumerable<dynamic>
实际上包含Guids
,它将工作。打印或检查每个项目,以确保它们是Guids
。
如果这是你所期望的,你应该使用IEnumerable<Guid>
并将传入的项目转换为Guids
。它将有望防止类似您可能看到的错误。
类似的东西…
var difference = list1.Where (e => !list2.Any(a => a == e))
你有:
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
Enumerable有一个Except方法
可点数的。Except Method (IEnumerable, IEnumerable)
使用String或GUID。
它会比较等号的值。
HashSet ExceptWith可能有更好的性能。
但如果需要允许重复,则不能使用HashSet。
HashSet。ExceptWith方法