C# 如果不能直接修改类,如何使用元素类型的字段值从另一个列表中删除列表?

C# 如果不能直接修改类,如何使用元素类型的字段值从另一个列表中删除列表?,c#,list,C#,List,假设我有一个名为big的对象产品列表,它有两个字段,ID和Name。列表已完全填充,这意味着每个元素的两个字段都不为null,尽管它们可以为null 我有另一个列表,比第一个列表小,名为small,但这次对于某些元素,字段名为null,而ID始终存在 我想从ID相同的大的地方去掉小的 例如: List<Product> big = { {1,A},{2,B},{3,C},{4,D} }; List<Product> small = { {1,null},{3,C} };

假设我有一个名为big的对象产品列表,它有两个字段,ID和Name。列表已完全填充,这意味着每个元素的两个字段都不为null,尽管它们可以为null

我有另一个列表,比第一个列表小,名为small,但这次对于某些元素,字段名为null,而ID始终存在

我想从ID相同的大的地方去掉小的

例如:

List<Product> big = { {1,A},{2,B},{3,C},{4,D} };
List<Product> small = { {1,null},{3,C} };
List<Product> result = { {2,B},{4,D}};
我不能修改产品对象,也就是说,我不能实现IEquatable,这样的接口也没有实现,这意味着big.Exceptsmall或big.RemoveAllsmall或big.ContainesAnelementOfsmall就这个问题而言不起作用,我已经试过了


我想避免迭代器删除或类似的双循环,我正在搜索具有特定谓词的内置函数。

使用简单谓词,您可以轻松实现它:

big.Where(p => !small.Any(o => o.id == p.id)).ToList();

转换为:从大的元素中选择p不足以满足小的元素o具有相同ID的情况。

使用简单的谓词,您可以轻松实现它:

big.Where(p => !small.Any(o => o.id == p.id)).ToList();
这可以翻译为:在元素p不足以满足小元素o具有相同ID的情况下,从大元素中进行选择。

为您的产品实现一个基于ID比较两个产品的方法。然后只需使用Except并传递比较器:

var result = big.Except(small, new ProductComparer()).ToList();
为您的产品实施一个基于ID比较两个产品的比较器。然后只需使用Except并传递比较器:

var result = big.Except(small, new ProductComparer()).ToList();
除了如何比较产品实例之外,您还需要说明

除了如何比较产品实例之外,您还需要说明


问题是我不能修改产品类:您不需要修改产品类。创建一个实现IEqualityComparerOh的新类,没错!为什么我没有想到?问题是我不能修改产品类:您不需要修改产品类。创建一个实现IEqualityComparerOh的新类,没错!我怎么没想到呢?