我想在列表列表上使用 Remove() 方法,但它对我不起作用。
简单的例子应该说明一切:
List<List<int>> list = new List<List<int>>();
list.Add(new List<int> { 0, 1, 2 });
list.Add(new List<int> { 1, 2 });
list.Add(new List<int> { 4 });
list.Add(new List<int> { 0, 1, });
list.Remove(new List<int> { 1, 2 });
如果我使用RemoveAt(1),它可以正常工作,但Remove()则不行。
这段代码返回 false 显然是同样的原因:
List<int> l1 = new List<int>();
List<int> l2 = new List<int>();
l1.Add(1);
l2.Add(1);
bool b1 = l1 == l2; // returns False
bool b2 = l1.Equals(l2); // returns False too
所以在我看来,我不能简单地比较两个列表甚至数组。我可以使用循环代替Remove(),但一定有更简单的方法。
提前致谢。
问题是List<T>
不覆盖Equals
and GetHashCode
,这就是List<T>
将在尝试查找项目时使用。 (事实上,它将使用默认的相等比较器,这意味着它将使用IEquatable<T>
如果对象实现了它,则返回到object.Equals
/GetHashCode
如果需要的话)。Equals
当您尝试删除不同的对象时将返回 false,默认实现只是比较引用。
基本上,您需要编写一个方法来比较两个列表是否相等,并使用它来查找要删除的条目的索引。然后你可以按索引删除(使用RemoveAt
)。编辑:如上所述,Enumerable.SequenceEqual
可用于比较列表。由于在可以轻松计算计数时并未首先检查计数是否相等,因此效率并不高。另外,如果你only需要比较List<int>
值,您可以避免对相等比较器的虚拟方法调用。
另一种选择是避免使用List<List<int>>
首先 - 使用List<SomeCustomType>
where SomeCustomType
includes a List<int>
。然后你可以实施IEquatable<T>
in that类型。请注意,这也可能允许您在自定义类型中封装适当的逻辑。我经常发现,通过“嵌套”集合类型的类型,自定义类型封装了meaning更有效地收集内部集合。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)