我想对列表的列表使用 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
和 GetHashCode
,这就是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/