从另一个中减去通用列表

Bob*_*bby 53 c# linq

我正在尝试从一个列表中删除另一个列表中的firmID.我真的不懂linq,但我很确定我需要使用它.

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

var result = firms.Contains(i => trackedFirms.Contains(i.FirmID));
Run Code Online (Sandbox Code Playgroud)

最后一行不起作用,系统说"未知方法包含(?)"即使我已经"使用System.Linq;" 在班级的顶部.

我的想法是从所有公司的名单中删除一个跟踪公司列表,以找到未跟踪的公司.

我希望这是有道理的.

Ali*_*eza 104

var result = firms.Except(trackedFirms); // returns all the firms except those in trackedFirms
Run Code Online (Sandbox Code Playgroud)

  • 这种方法的唯一问题是,您使用两个列表中都包含的相同的Firm公司实际实例作为基础... (4认同)
  • @RGraham不,你刚刚链接到Linq方法,你只是从`List <T>`页面的扩展方法部分链接到它.`List <T>`没有实例`Except`方法.如果您选择该页面上的一个重载,您将看到它们定义的命名空间是`System.Linq`,第一个参数是`IEnumerable <T>`而不是`List <T>`. (2认同)

Mar*_*lan 9

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

List<Firm> results = Firms.Where(f => TrackedFirms.Any(t => t.FirmId == f.FirmId)).ToList();
Run Code Online (Sandbox Code Playgroud)

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

List<Firm> results = Firms.Where(f => !TrackedFirms.Any(t => t.FirmId == f.FirmId)).ToList();
Run Code Online (Sandbox Code Playgroud)


Ale*_*ria 7

我认为这应该有效

var result = firms.Where(x => !trackedFirms.Any(y => x.FirmID == y.FirmID));
Run Code Online (Sandbox Code Playgroud)

从各公司firms选择的公司,是不是trackedFirms(至少这是我从你的问题理解)。


Meh*_*ral 5

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

firms.Where(x=> trackedFirms.All(y => y.FirmId != x.FirmId)
Run Code Online (Sandbox Code Playgroud)