当前位置: 首页 > 编程语言 > C#

List-List-Remove()方法分享

时间:2023-04-10 21:22:32 C#

ListRemove()方法我想在list列表中使用Remove()方法,但是对我不起作用。简单的例子应该说明一切:Listlist=newList();list.Add(新列表{0,1,2});list.Add(新列表{1,2});列表.Add(新列表{4});list.Add(新列表{0,1,});list.Remove(新列表{1,2});如果我使用RemoveAt(1)它工作正常但remove()No。显然这段代码出于同样的原因返回false:Listl1=newList();清单l2=新清单();l1.添加(1);l2.添加(1);布尔b1=l1==l2;//返回假boolb2=l1.Equals(l2);//也返回False所以在我看来,我不能简单地比较两个列表甚至数组。我可以使用循环代替Remove(),但必须有更简单的方法。提前致谢。第一种方法:ListlistToRemove=newList{1,2};list.RemoveAll(innerList=>innerList.Except(listToRemove).Count()==0);这也删除了List{2,1}SecondOne方法(首选):ListlistToRemove=newList{1,2};list.RemoveAll(innerList=>innerList.SequenceEqual(listToRemove));这将删除所有包含与提供的列表相同序列的列表。问题是List没有覆盖Equals和GetHashCode,这是List在尝试查找项目时将使用的内容。(实际上,它将使用默认的相等比较器,这意味着如果对象实现它,它将使用IEquatable实现,并在必要时回退到object.Equals/GetHashCode)。当您尝试删除其他对象时,Equals将返回false,默认实现只是比较引用。基本上,您已经编写了一个方法来比较两个列表是否相等,并使用它来查找要删除的条目的索引。然后您将按索引删除(使用RemoveAt)。编辑:如上所述,Enumerable.SequenceEqual可用于比较列表。这并不像它应该的那样有效,因为当计数可以很容易地计算时,最初并没有检查计数是否相等。此外,如果您只需要比较List值,则可以避免对相等比较器调用虚方法。另一种方法是首先避免List>-在SomeCustomType包含List的地方使用List。然后您可以在该类型中实现IEquatable。请注意,这也可能允许您在自定义类型中封装适当的逻辑。我经常发现,根据您拥有“嵌套”集合类型的类型,自定义类型更有效地封装了内部集合的含义。列表相等是引用相等。它不会删除列表,除非它与外部列表中的列表具有相同的引用。您可以创建一个新类型,将相等性实现为集合相等性而不是引用相等性(或者您也关心顺序吗?)。然后你可以制作这种类型的列表。这根本不起作用,因为你想删除一个全新的列表(新的关键字类型表明如此),而不是你刚放在那里的那个。例如,下面的代码创建了两个不同的列表,因为它们不是同一个列表,但它们看起来是一样的:varlist0=newList{1,2};varlist1=新列表{1,2};然而,下面的内容创建了一个列表,但是两个引用同一个列表:varlist0=newList{1,2};变量列表1=列表0;所以如果你以后想用Remove操作它,你应该保留你放在A中的引用对列表的引用所以:varlist0=newList{1,2};listOfLists.Remove(list0);它们是不同的对象。试试这个:ListMyList=newList{1,2};列表>列表=新列表>();list.Add(新列表{0,1,2});列表。添加(我的列表);list.Add(新列表{4});list.Add(新列表{0,1,});列表.删除(我的列表);您需要指定对要删除的列表的引用:list.Remove(list[1]);这还真是一模一样。以上就是C#学习教程:ListRemove()方法分享的全部内容。如果对大家有用,需要详细了解C#学习教程,希望大家多多关注——list.RemoveAt(1);本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: