Linq介于IENumerable和List<>之间

时间:2009-07-10 10:43:03

标签: c# .net linq

我填充List<Object1>对象1包含2个字段(int id&amp; string name)

我也有IEnumerable<Object2>由linq2sql生成。使用字段(id,name)

我需要List<Object1>IEnumerable<Object2> ID 中的项目不在IEnumerable Object2 List<Object1> excepted = Object2.Where(t => obj1.Contains == t.Id); 。  通过关键字段= ID (比如sql中的位置..)

我使用了像

这样的代码
{{1}}

谢谢!

4 个答案:

答案 0 :(得分:5)

怎么样:

HashSet<string> knownIds = new HashSet<string>(list2.Select(x => x.Id));
var exceptions = list1.Where(x => !knownIds.Contains(x.Id));

正如Earwicker正确地说的那样,这只会给IEnumerable<Object1> - 如果你需要一个列表,请将第二行更改为:

var exceptions = list1.Where(x => !knownIds.Contains(x.Id)).ToList();

答案 1 :(得分:2)

您可以通过以下方式实现此目的。

var excepted = objects1.Where(o1 => !objects2.Select(o2 => o2.Id).Contains(o1.Id));

最好的问候

答案 2 :(得分:2)

我很惊讶没有人建议加入:

var excepted = (from o1 in List1
                join o2 in List2
                  on o1.Id equals o2.Id into j
                where !j.Any() // j is empty
                select o1
                ).ToList();

可能略低于Jon的HashSet解决方案,但查询语法很有趣。

答案 3 :(得分:0)

继Jon Skeet的回答之后,您需要在表达式末尾使用ToList()扩展方法,将其转换为List。