gpt4 book ai didi

c# - List> Remove() 方法

转载 作者:太空狗 更新时间:2023-10-29 23:55:21 27 4
gpt4 key购买 nike

我想对列表的列表使用 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com