使用LINQ检查列表中的所有项是否出现在另一个列表中

4

我在这里遇到了一个问题。我正在尝试使用linq将一个列表中的项目与另一个更大的列表中的项目进行比较。

例如:

list 1: 10,15,20
list 2: 10,13,14,15,20,30,45,54,67,87

如果list 1中的所有项目都出现在list 2中,我应该得到TRUE。所以上面的示例应该返回TRUE
就像您看到的那样,我无法使用sequenceEquals
有什么想法吗?
编辑:
实际上,list2不是列表,而是SQL中的一列,其具有以下值:<id>673</id><id>698</id><id>735</id><id>1118</id><id>1120</id><id>25353</id>
在linq中,我根据Jon Skeet的帮助进行了以下查询:
var query = from e in db
            where e.taxonomy_parent_id == 722
            select e.taxonomy_item_id;

当前,查询是一个 IQueryable 的 long 类型的对象。

var query2 = from e in db
             where query.Contains(e.taxonomy_item_id)
             where !lsTaxIDstring.Except(e.taxonomy_ids.Replace("<id>", "")
                                                       .Replace("</id>", "")
                                                       .Split(',').ToList())
                                 .Any()
             select e.taxonomy_item_id;

但是现在我遇到了错误:Local sequence cannot be used in LINQ to SQL implementation of query operators except the Contains() operator
3个回答

8
怎么样:
if (!list1.Except(list2).Any())

这是我能想到的最简单的方法。如果您愿意,可以明确地创建集合等:

HashSet<int> set2 = new HashSet<int>(list2);
if (!list1.Any(x => set2.Contains(x)))

但我预计这基本上就是 Except 的实现方式。


嗨,Jon,我更新了主题消息。您可以在“编辑:”下看到我的更新文本。 - Ozkan
@Ozkan:你不能做些什么来解决数据库包含XML而不是更合适的数据格式(例如单独的关系表)的问题吗? - Jon Skeet
这是由于转置查询而添加的。而且 MS SQL 2008 会自动将其添加为 Expr1(我已将其更改为 id)。 - Ozkan
@Ozkan:说实话,你的意思并不是很清楚。请记住,我们没有你拥有的所有上下文信息。如果你能改变你的模式以使用正常关系,那会让生活更简单。 - Jon Skeet
我知道这个表没有规范化,但这是唯一的方法。我没有更改表结构的权限。难道没有办法让这个查询工作吗?我不再关注性能,因为我已经花费太多时间了……谢谢 - Ozkan
显示剩余4条评论

3
这应该是你想要的内容:
!list1.Except(list2).Any() 

2
var result = list1.All(i => list2.Any(i2 => i2 == i));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接