如何找到两个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

如何找到两个IEnumerable对象之间的差异

中的Guids

这是正确的:

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方法

相关文章: