こんにちは私は簡単な質問をしています。リストから配列を削除する
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);
値がまだ配列されている場合、何が原因である可能性がありますか?
int[]
はとても基本的にmock
とlist[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
を使いたいならば、あなたはEquals
とGetHashCode
を上書きするか、IEqualityComparer<T>
カスタムを提供する必要があると思います(それは参照型である)、その後FirstOrDefault
を使用し、その結果にRemove
を使用します。
var result = list.FirstOrDefault(item => mock.SequenceEqual(item));
if(result != null)
{
list.Remove(result);
}
同じ値を持つ2つの配列があります。 .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);
このアレイは参照によって削除されています。あなたが等しい配列を削除したい場合は、配列類似性をチェックする必要があります。
list.RemoveAll(e => e.SequenceEqual(mock));
あなたは2つのオブジェクト参照を比較している、と彼らは同じではありません。バイト配列の内容を比較する必要があります。 あなたは、C#(3.5 orhigher)
ブール値等しい= Array1.SequenceEqual(配列2)にSequenceEqualを使用する必要があります。
これはLinqの実装が必要です。
list.RemoveAll(x => mock.SequenceEqual(x));
次のMSDNリンク MSDN - SequenceEqual
@Wojciech Szabowiczを参照してください - あなたが理解し、問題を解決するため、この役に立ちましたか? –