2014-09-13 2 views
0

Except 메서드를 사용하여 사용자 지정 개체 목록에서 개체를 제거하려면 개체에 IEqualityComparer를 구현해야합니다. 하지만 정상적인 foreach 루프에서 객체를 제거하는 것이 좋지 않습니까?수동으로 컬렉션에서 항목 제거 Enumerable.Except C#

IEqualityComparer의 개념을 이해하고 Except를 사용하지만 항목을 수동으로 제거했을 때 어떤 이유로 작동하지 못했습니다. 이것은 나쁜 프로그래밍으로 간주됩니까?

편집 : 수동 방법 ID를 사용하여 내보기 모델을 오염시키는 Equals 및 GetHashcode를 재정의해야합니다.

+0

아무 잘못 없습니다. 뷰 모델을 오염시키고 싶지 않다면'list1.Where (! list2.Any (x.What == y.What))' –

답변

1

일반적으로 열거하는 동안 컬렉션을 변경하지 않아야합니다.

나는 전체가이 아니며 원래 문제가 무엇인지, 또는 그런 방식으로 요소를 제거해야하는 이유를 알고 있지만 문제가 지나치게 복잡합니다. 내가 올바르게 이해한다면 실제로는 T가 사용자 정의 유형 인 List<T>을 사용하고 있습니다. 이 경우 LINQ 쿼리를 사용하여 목록에서 원하는 값을 가져옵니다.

var newList = oldList.Where(x => x.PropertyName != unwantedValue); 

당신은 Enumerable.Except를 사용할 수 있지만 Enumerable.Except 리턴한다 가, 중복 값이 ​​허용되지 않습니다 말을하는 것입니다있는를 설정하는 것이 주목해야한다.

또한 .Equals.GetHashCode을 무시하면 내가 아는 한 뷰 모델을 오염시키지 않습니다.

출처 : 당신이 한 예상대로 작동하기 때문에 설명서를 할 경우

http://msdn.microsoft.com/en-us/library/vstudio/bb336390(v=vs.100).aspx

Enumerable.Except Problem

+0

을 사용하여 열거 중에 컬렉션을 변경할 수 없으며 런타임 예외가 발생합니다. –

+0

그걸 통해 열거되지 않을 것입니다, 그것을 통해 iterating이야. 열거 형은 "열거 자"패턴을 사용/필요합니다 –

+1

GetEnumerator(), MoveNext() 및'Current' :-) –