C# 手动删除集合中的项与使用可枚举项相比。C除外#

C# 手动删除集合中的项与使用可枚举项相比。C除外#,c#,linq,collections,equality,C#,Linq,Collections,Equality,要使用Except方法从自定义对象列表中删除对象,需要在对象上实现IEqualityComparer。但是仅仅删除普通foreach循环中的对象是否不好 我理解IEqualityComparer的概念,并使用Except,但由于某些原因,我无法使其正常工作,所以我只是手动删除了这些项。这被认为是糟糕的编程吗 编辑:使用手动方式id必须覆盖Equals和GetHashcode,这会污染我的视图模型-我想这很糟糕?一般来说,在枚举时应该避免对集合进行更改 我不完全确定您最初的问题是什么,或者为什么需

要使用Except方法从自定义对象列表中删除对象,需要在对象上实现IEqualityComparer。但是仅仅删除普通foreach循环中的对象是否不好

我理解IEqualityComparer的概念,并使用Except,但由于某些原因,我无法使其正常工作,所以我只是手动删除了这些项。这被认为是糟糕的编程吗


编辑:使用手动方式id必须覆盖Equals和GetHashcode,这会污染我的视图模型-我想这很糟糕?

一般来说,在枚举时应该避免对集合进行更改

我不完全确定您最初的问题是什么,或者为什么需要以这种方式删除元素,但是您将问题复杂化了。如果我理解正确,您实际上使用的是一个
列表
,其中T是一个自定义类型。如果是这种情况,那么只需使用LINQ查询即可从列表中获取所需的值

var newList = oldList.Where(x => x.PropertyName != unwantedValue);
您可以使用
Enumerable.Except
,但是应该注意的是
Enumerable.Except
返回一个集,也就是说,不允许重复值

另外,应该注意,据我所知,重写
.Equals
.GetHashCode
不会污染viewmodel

资料来源:


只要按预期的方式操作手册,就没有问题。如果您不想污染viewmodel,可以使用
list1.Where(!list2.Any(x.What==y.What))
在枚举时更改集合是非法的,并且会导致运行时异常。这不是枚举集合,而是迭代集合。枚举将使用/需要“枚举器”模式
GetEnumerator()
MoveNext()
Current
:-)