2016-11-03 15 views
1

こんにちは私は簡単な質問をしています。リストから配列を削除する

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

値がまだ配列されている場合、何が原因である可能性がありますか?

答えて

4

int[]はとても基本的にmocklist[0]参照型ではなく値型であるため、それはあなたのために動作しません。同じではありません。

何ができることは、すべての項目が同じであるすべてのそれらの内側の配列を見つけるためにSequenceEqualsを使用する述語を指定するRemoveAllを使用することです:

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)); 

SequenceEqualは、すべての項目ことを確認します2配列はEqualです - ここでも値または参照型の場合は重要ですが、値型の場合は正しく動作します。インナーアイテムが参照型であれば、我々は同じオブジェクトを指定する必要がありますことを理解した後、あなたが今、Removeを使いたいならば、あなたはEqualsGetHashCodeを上書きするか、IEqualityComparer<T>


カスタムを提供する必要があると思います(それは参照型である)、その後FirstOrDefaultを使用し、その結果にRemoveを使用します。

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

@Wojciech Szabowiczを参照してください - あなたが理解し、問題を解決するため、この役に立ちましたか? –

3

同じ値を持つ2つの配列があります。 .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

このアレイは参照によって削除されています。あなたが等しい配列を削除したい場合は、配列類似性をチェックする必要があります。

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

あなたは2つのオブジェクト参照を比較している、と彼らは同じではありません。バイト配列の内容を比較する必要があります。 あなたは、C#(3.5 orhigher)

ブール値等しい= Array1.SequenceEqual(配列2)にSequenceEqualを使用する必要があります。

これはLinqの実装が必要です。

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

次のMSDNリンク MSDN - SequenceEqual

関連する問題