我有一个从外部应用程序返回的人员列表,我在我的本地应用程序中创建了一个排除列表,让我可以选择从列表中手动删除人员.
我有一个我创建的复合键,这两个键都很常见,我希望找到一种有效的方法,可以使用我的列表从列表中删除人员
例如
class Person { prop string compositeKey { get; set; } } class Exclusions { prop string compositeKey { get; set; } } Listpeople = GetFromDB; List exclusions = GetFromOtherDB; List filteredResults = People - exclustions using the composite key as a comparer
我认为LINQ是这样做的理想方式,但是在尝试连接,扩展方法,使用产量等之后我还是遇到了麻烦.
如果这是SQL我会使用not in (?,?,?)
查询.
看一下Except方法,你可以这样使用:
var resultingList = listOfOriginalItems.Except(listOfItemsToLeaveOut, equalityComparer)
您将要使用我链接的重载,它允许您指定自定义IEqualityComparer.这样,您可以根据组合键指定项目的匹配方式.(但是,如果已经重写了Equals,则不应该使用IEqualityComparer.)
编辑: 因为看起来你正在使用两种不同类型的类,这是另一种可能更简单的方法.假设有一个List
被叫persons
和List
被叫exclusions
:
var exclusionKeys = exclusions.Select(x => x.compositeKey); var resultingPersons = persons.Where(x => !exclusionKeys.Contains(x.compositeKey));
换句话说:只从键中选择排除项,然后从人员中选择所有没有任何键的Person对象.
我只会在List类上使用FindAll方法。即:
ListfilteredResults = people.FindAll(p => return !exclusions.Contains(p));
不知道语法是否会与您的对象完全匹配,但是我想您可以看到我要使用的语法。