从列表中删除数组

时间:2016-11-03 13:02:43

标签: c#

您好我有一个简单的问题。当我尝试从数组列表中删除数组时:

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

值仍在数组中,可能是什么原因?

5 个答案:

答案 0 :(得分:4)

它不适合您,因为int[]引用类型而非值类型,所以基本上mocklist[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 - 这里也很重要,如果它是值或引用类型,但在您的情况下使用值类型它将起作用。如果内部项是引用类型,则必须覆盖EqualsGetHashCode或提供自定义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