72

我正在尝试从另一个列表中删除一个公司 ID 列表。我不太了解 linq,但我很确定我需要使用它。

List<Firm> firms = GetBusinessDevelopmentFirms(database);
List<Firm> trackedFirms = GetAllCLIFirmsBeingTrackedByUser();

var result = firms.Contains(i => trackedFirms.Contains(i.FirmID));

最后一行不起作用,系统显示“未知方法包含(?)”,即使我已经输入“使用 System.Linq;” 在班上名列前茅。

我的想法是从所有公司的列表中删除跟踪公司的列表,以找到未跟踪的公司。

我希望这是有道理的。

4

6 回答 6

138
var result = firms.Except(trackedFirms); // returns all the firms except those in trackedFirms
于 2013-09-19T13:21:14.210 回答
12

从上面的代码中,我假设您正在尝试从在 TrackedFirms 中有相应项目的公司获取条目。

List<Firm> results = Firms.Where(f => TrackedFirms.Any(t => t.FirmId == f.FirmId)).ToList();

另一方面,如果您想要未跟踪的公司,那么它是:

List<Firm> results = Firms.Where(f => !TrackedFirms.Any(t => t.FirmId == f.FirmId)).ToList();
于 2013-09-19T13:28:33.987 回答
8

我认为这应该有效

var result = firms.Where(x => !trackedFirms.Any(y => x.FirmID == y.FirmID));

从所有公司中firms选择不在其中的公司trackedFirms(至少这是我从你的问题中理解的)。

于 2013-09-19T13:27:17.913 回答
3

ContainsList<T>期望您传入的本机方法T。你想要Where

var result = firms.Where(i => trackedFirms.Contains(i.FirmID));

如果您希望result是 aList<T>然后添加.ToList()到您的WhereLINQ 表达式的末尾。

于 2013-09-19T13:20:24.987 回答
3

最好的方法是Except()你的情况。但是,如果 List 对象与其他对象不同,则可以使用All()

firms.Where(x=> trackedFirms.All(y => y.FirmId != x.FirmId)
于 2018-06-26T14:33:10.080 回答
0

如果您有列表 X 和列表 Y,并且您想删除 Y 中 X 中的所有项目,您可以尝试以下操作:

X.相交(Y)

比较两个列表并返回不同的值和差异

于 2013-09-19T13:21:24.940 回答