我有一个从外部应用程序返回的人员列表,我正在我的本地应用程序中创建一个排除列表,以便我可以选择从列表中手动删除人员。
我有一个我创建的复合键,它对两者都是通用的,我想找到一种使用我的列表从我的列表中删除人员的有效方法
例如
class Person
{
prop string compositeKey { get; set; }
}
class Exclusions
{
prop string compositeKey { get; set; }
}
List<Person> people = GetFromDB;
List<Exclusions> exclusions = GetFromOtherDB;
List<Person> filteredResults = People - exclustions using the composite key as a comparer
我认为 LINQ 是执行此操作的理想方式,但在尝试连接、扩展方法、使用 yield 等之后,我仍然遇到了问题。
如果这是 SQL,我会使用 not in (?,?,?)
查询。
最佳答案
看看 Except方法,您可以这样使用:
var resultingList =
listOfOriginalItems.Except(listOfItemsToLeaveOut, equalityComparer)
您需要使用我链接到的重载,它允许您指定自定义 IEqualityComparer。这样您就可以指定项目如何根据您的复合键进行匹配。 (不过,如果您已经重写了 Equals,则不需要 IEqualityComparer。)
编辑:因为看起来您使用的是两种不同类型的类,所以这是另一种可能更简单的方法。假设 List<Person>
称为 persons
和一个 List<Exclusion>
称为 exclusions
:
var exclusionKeys =
exclusions.Select(x => x.compositeKey);
var resultingPersons =
persons.Where(x => !exclusionKeys.Contains(x.compositeKey));
换句话说:仅从排除项中选择键,然后从 persons 中选择所有不具有这些键的所有 Person 对象。
关于c# - 使用 LINQ 过滤列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/417246/