7

我有 2 个指南列表:

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

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

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

我试过以下

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

以上实际均未返回 2 之间的差异。

如何获得两者中都不存在的 guid 的差异。

我确定 lsCheckedUsers 在用户 ID 中有 Guid

4

4 回答 4

13

这是对的:

var userdifference = userids.Except(lsCheckedUsers);

IEnumerable<dynamic>如果你们两个都实际包含,它将起作用Guids。打印或检查每个项目以确保它们是Guids.

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

于 2013-03-27T18:51:06.343 回答
2

沿着这些线的东西..

var difference = list1.Where (e => !list2.Any(a => a == e))
于 2013-03-27T18:27:38.447 回答
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。

于 2013-03-27T18:22:18.737 回答
1

Enumerable 有一个 except 方法

Enumerable.Except 方法(IEnumerable、IEnumerable)

并使用字符串或 GUID。
它将比较等于的值。

HashSet exceptWith 可能会有更好的性能。
但如果您需要允许重复,则不能使用 HashSet。

HashSet.ExceptionWith 方法

于 2013-03-27T18:43:18.663 回答