您好我有一个简单的问题。当我尝试从数组列表中删除数组时:
var mock = new byte[] { 0x00, 0x01, 0x02 };
var list = new List<byte[]> { new byte[] { 0x00, 0x01, 0x02 } };
list.Remove(mock);
值仍在数组中,可能是什么原因?
答案 0 :(得分:4)
它不适合您,因为int[]
是引用类型而非值类型,所以基本上mock
和list[0]
不一样。< / p>
您可以使用RemoveAll
指定一个谓词,该谓词将使用SequenceEquals
来查找所有项目相同的所有内部数组:
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
- 这里也很重要,如果它是值或引用类型,但在您的情况下使用值类型它将起作用。如果内部项是引用类型,则必须覆盖Equals
和GetHashCode
或提供自定义IEqualityComparer<T>
如果您确实想使用Remove
,现在我们知道必须指定相同的对象(并且它是引用类型),然后使用FirstOrDefault
,然后在该结果上使用{ {1}}:
Remove
答案 1 :(得分:3)
您有2个具有相同值的数组。 .Remove
以引用而非价值。
var mock = new byte[] { 0x00, 0x01, 0x02 };
var mock2 = new byte[] { 0x00, 0x01, 0x02 };
mock === mock2; // false
答案 2 :(得分:1)
这是因为您要删除的对象与列表中的对象不同,尽管值相同。试试这个,你会发现它工作正常:
var mock = new byte[] { 0x00, 0x01, 0x02 };
var list = new List<byte[]> { {mock} };
list.Remove(mock);
答案 3 :(得分:1)
您正在通过引用删除数组。如果要删除相等的数组,则必须检查序列相似性:
list.RemoveAll(e => e.SequenceEqual(mock));
答案 4 :(得分:1)
您正在比较两个对象引用,它们并不相同。您需要比较字节数组内容。 您必须在c#(3.5或更高版本)中使用 SequenceEqual
bool equal = Array1.SequenceEqual(Array2);
它需要Linq实现。
list.RemoveAll(x =&gt; mock.SequenceEqual(x));
请参阅以下MSDN链接 MSDN - SequenceEqual