c# - 使用 LINQ 过滤列表

标签 c# linq list linq-to-objects

我有一个从外部应用程序返回的人员列表,我正在我的本地应用程序中创建一个排除列表,以便我可以选择从列表中手动删除人员。

我有一个我创建的复合键,它对两者都是通用的,我想找到一种使用我的列表从我的列表中删除人员的有效方法

例如

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/

相关文章:

c# - 获取 Xamarin Android 设备调用运行本地主机的 ASP.NET Web APi

c# - 如何从数组创建不同值的字符串(包括其他字符)

c# - 具有分组依据的 Linq 查询

PHP "list"问题 : Why the result is in reverse order?

c# - 使用 c# 可能性避免空引用

C# Linq 多级连接表

c# - react 性 : Trying to understand how Subject<T> work

c# - 我的内部连接有问题

python - 为什么单独附加一个列表会创建一个无限列表

c# - 如果多个条目具有相同的值,List.OrderBy() 的结果是什么?