2016-11-03 4 views
1

안녕하세요, 간단한 질문이 있습니다. 배열리스트에서 배열을 제거하려고 할 때 :목록에서 배열 제거

var mock = new byte[] { 0x00, 0x01, 0x02 }; 
var list = new List<byte[]> { new byte[] { 0x00, 0x01, 0x02 } }; 
list.Remove(mock); 

여전히 값이 배열되어 있는데, 그 원인은 무엇일까요?

답변

4

그것은 당신을 위해 작동하지 않습니다 동일하지 않습니다.

은 무엇 당신이 할 수있는 모든 항목이 동일한 모든 내부 배열을 찾을 SequenceEquals를 사용하는 조건을 지정하는 RemoveAll를 사용하는 경우 : SequenceEqual 확인합니다

var mock = new byte[] { 0x00, 0x01, 0x02 }; 
var list = new List<byte[]> 
{ 
    new byte[] { 0x00, 0x01, 0x02 }, 
    new byte[] { 0x03, 0x04, 0x05 } 
}; 

list.RemoveAll(item => mock.SequenceEqual(item)); 

을 그의 모든 항목 2 배열은 Equal입니다. 여기에서는 값 또는 참조 유형 인 경우 중요하지만 값 유형을 사용하는 경우 작동합니다. 내부 항목 참조 형식 인 경우에 당신은 사용자에게 EqualsGetHashCode을 무시하거나 제공해야 할 것 IEqualityComparer<T>


당신은 우리가 우리가 같은 개체를 지정해야한다는 이해 한 후 지금 Remove을 사용하고자하는 경우 다음 FirstOrDefault를 사용하고 그 결과를 사용 (그리고 참조 형식 임) Remove :

var result = list.FirstOrDefault(item => mock.SequenceEqual(item)); 
if(result != null) 
{ 
    list.Remove(result); 
} 
+0

@Wojciech Szabowicz를 참조하십시오? –

3

동일한 값을 가진 배열이 두 개 있습니다. .Remove은 값이 아니라 참조로 이동합니다.

var mock = new byte[] { 0x00, 0x01, 0x02 }; 
var mock2 = new byte[] { 0x00, 0x01, 0x02 }; 
mock === mock2; // false 
1

값이 같더라도 삭제하려는 개체가 목록의 개체와 같지 않기 때문입니다. 이것을 시도하면 잘 작동하는 것을 볼 수 있습니다 :

var mock = new byte[] { 0x00, 0x01, 0x02 }; 
var list = new List<byte[]> { {mock} }; 
list.Remove(mock); 
1

참고로 배열을 제거하고 있습니다. 당신이 동일 배열을 제거하려면, 당신은 서열의 유사성을 확인해야한다 : int[] 그래서 기본적으로 mocklist[0]참조 형 값이 아닌 형식이기 때문에

list.RemoveAll(e => e.SequenceEqual(mock)); 
1

당신은 두 개의 객체 참조를 비교하고, 그들은 동일하지 않습니다. 바이트 배열 내용을 비교해야합니다. 당신의 C# (3.5 orhigher)

BOOL 동일한 = Array1.SequenceEqual (배열 2)에 SequenceEqual를 사용해야;

Linq 구현이 필요합니다.

list.RemoveAll (x => mock.SequenceEqual (x)); 나요 당신이 이해 도움말을하고 문제를 해결 -

은 다음 MSDN 링크 MSDN - SequenceEqual