안녕하세요, 간단한 질문이 있습니다. 배열리스트에서 배열을 제거하려고 할 때 :목록에서 배열 제거
var mock = new byte[] { 0x00, 0x01, 0x02 };
var list = new List<byte[]> { new byte[] { 0x00, 0x01, 0x02 } };
list.Remove(mock);
여전히 값이 배열되어 있는데, 그 원인은 무엇일까요?
안녕하세요, 간단한 질문이 있습니다. 배열리스트에서 배열을 제거하려고 할 때 :목록에서 배열 제거
var mock = new byte[] { 0x00, 0x01, 0x02 };
var list = new List<byte[]> { new byte[] { 0x00, 0x01, 0x02 } };
list.Remove(mock);
여전히 값이 배열되어 있는데, 그 원인은 무엇일까요?
그것은 당신을 위해 작동하지 않습니다 동일하지 않습니다.
은 무엇 당신이 할 수있는 모든 항목이 동일한 모든 내부 배열을 찾을 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
입니다. 여기에서는 값 또는 참조 유형 인 경우 중요하지만 값 유형을 사용하는 경우 작동합니다. 내부 항목 참조 형식 인 경우에 당신은 사용자에게 Equals
및 GetHashCode
을 무시하거나 제공해야 할 것 IEqualityComparer<T>
당신은 우리가 우리가 같은 개체를 지정해야한다는 이해 한 후 지금 Remove
을 사용하고자하는 경우 다음 FirstOrDefault
를 사용하고 그 결과를 사용 (그리고 참조 형식 임) Remove
:
var result = list.FirstOrDefault(item => mock.SequenceEqual(item));
if(result != null)
{
list.Remove(result);
}
동일한 값을 가진 배열이 두 개 있습니다. .Remove
은 값이 아니라 참조로 이동합니다.
var mock = new byte[] { 0x00, 0x01, 0x02 };
var mock2 = new byte[] { 0x00, 0x01, 0x02 };
mock === mock2; // false
값이 같더라도 삭제하려는 개체가 목록의 개체와 같지 않기 때문입니다. 이것을 시도하면 잘 작동하는 것을 볼 수 있습니다 :
var mock = new byte[] { 0x00, 0x01, 0x02 };
var list = new List<byte[]> { {mock} };
list.Remove(mock);
참고로 배열을 제거하고 있습니다. 당신이 동일 배열을 제거하려면, 당신은 서열의 유사성을 확인해야한다 : int[]
그래서 기본적으로 mock
및 list[0]
참조 형 값이 아닌 형식이기 때문에
list.RemoveAll(e => e.SequenceEqual(mock));
당신은 두 개의 객체 참조를 비교하고, 그들은 동일하지 않습니다. 바이트 배열 내용을 비교해야합니다. 당신의 C# (3.5 orhigher)
BOOL 동일한 = Array1.SequenceEqual (배열 2)에 SequenceEqual를 사용해야;
Linq 구현이 필요합니다.
list.RemoveAll (x => mock.SequenceEqual (x)); 나요 당신이 이해 도움말을하고 문제를 해결 -
은 다음 MSDN 링크 MSDN - SequenceEqual
@Wojciech Szabowicz를 참조하십시오? –