c# - List<List<int>> Remove() 方法

标签 c# list

我想对列表的列表使用 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>不会覆盖 EqualsGetHashCode ,这就是List<T>将在尝试查找项目时使用。 (事实上​​ ,它将使用默认的相等比较器,这意味着如果对象实现它,它将使用 IEquatable<T> 实现,并在必要时回退到 object.Equals/GetHashCode )。 Equals将在您尝试删除不同的对象时返回 false,默认实现只是比较引用。

基本上,您需要编写一个方法来比较两个列表是否相等,并使用它来查找要删除的条目的索引。然后您将按索引删除(使用 RemoveAt )。编辑:如前所述,Enumerable.SequenceEqual可用于比较列表。这并不像它可能的那样有效,因为在可以轻松计算计数时没有最初检查计数是否相等。另外,如果您需要比较List<int>值,您可以避免对相等比较器的虚方法调用。

另一种选择是避免使用 List<List<int>>首先 - 使用 List<SomeCustomType>其中 SomeCustomType 包括一个List<int> .然后你可以实现 IEquatable<T>那个类型。请注意,这也可能允许您在自定义类型中封装适当的逻辑。我经常发现,根据您拥有“嵌套”集合类型的类型,自定义类型可以更有效地封装内部集合的含义

关于c# - List<List<int>> Remove() 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5607572/

相关文章:

c# - 我如何在我的 child 中设置对 ForeignKey 的依赖

c# - Entity Framework 连接字符串不是来自配置

c# - 确保网络用户唯一性的最佳数据组合?

list - 元组F#的排序列表

具有可变大小和可变类型的 C++ 容器

C# n 派生对象的通用工厂模式(创建所有父类(super class)型)?

c# - 如果基于 StartsWith 的语句在 C# 中找不到 "\\"

c - 如何在 C 中传递 char 数组?

jquery - 使用 jquery 识别在多级列表中单击了哪个项目

python - 如何遍历嵌套列表以从 1 到 5 对每个列表进行编号 :