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

如何在不改变原列表的情况下改变新的列表?分享

时间:2023-04-10 17:40:43 C#

怎样才能在不改变原listing的情况下,改变新的listing呢?我有一个列表,其中填充了一些来自操作的数据,我将其存储在内存缓存中。现在我想要另一个列表,其中包含基于某些条件的列表中的一些子数据。从下面的代码中可以看出,我正在对目标列表进行一些操作。问题是我对目标列表所做的任何更改也会对mainList进行。我认为这是因为参考是相同的。我只需要对目标列表进行操作而不影响主列表中的数据。列表目标=mainList;某些操作函数(目标);voidListSomeOperationFunction(Listtarget){target.removeat(3);返回目标;您需要在方法中克隆列表,因为List是一个类,它是一个引用类型并通过引用传递。例如:ListSomeOperationFunction(Listtarget){Listtmp=target.ToList();tmp.RemoveAt(3);返回tmp;}或ListSomeOperationFunction(Listtarget){Listtmp=newList(target);tmp.RemoveAt(3);返回tmp;}或ListSomeOperationFunction(Listtarget){Listtmp=newList();tmp.AddRange(目标);tmp.RemoveAt(3);返回tmp;您需要复制列表,以便更改不会影响原始列表。最简单的方法是使用System.Linq中的ToList扩展方法。varnewList=SomeOperationFunction(target.ToList());首先建立一个新的列表并对其进行操作,因为列表是引用类型,即当你在函数中传递它时,你传递的不仅仅是值,还有实际对象本身。如果只是把target赋值给mainList,两个变量都指向同一个对象,所以需要新建一个List:Listtarget=newList(mainList);voidListSomeOperationFunction()没有意义,因为要么不返回任何内容(void),要么返回一个列表。所以要么从方法中删除return语句,要么返回一个新的List。在后一种情况下,我会将其重写为:Listtarget=SomeOperationFunction(mainList);ListSomeOperationFunction(Listtarget){varnewList=newList(target);newList.RemoveAt(3);返回新列表;您的目标变量是引用类型。这意味着你对它所做的任何事情都会反映在你传递给它的列表中。否则,您需要在方法中创建新列表,将目标内容复制到该列表,然后对新列表执行删除。关于引用和值类型即使你创建了一个新列表,对新列表中项目的引用仍然会指向旧列表中的项目,所以如果我需要一个新列表和新引用,我想使用这种扩展方法。.publicstaticIEnumerableClone(thisIEnumerabletarget)whereT:ICloneable{If(target.IsNull())thrownewArgumentException();列表retVal=newList();foreach(TcurrentItemintarget)retVal.Add((T)(currentItem.Clone()));返回retVal.AsEnumerable();你正在查看正在修改的原始列表,因为默认情况下任何非原始对象都是通过引用传递的(它实际上是通过值传递的,值是引用,但这是另一回事)。您需要做的是克隆该对象。这个问题将帮助您使用一些代码在C#中克隆列表:HowtocloneagenericlistinC#?我不会将mainList分配给目标,而是这样做:target.AddRange(mainList);然后您将获得该项目的副本,而不是对列表的引用。只需确保使用通过复制源列表的元素创建的列表来初始化新列表。列表目标=mainList;应该是Listtarget=newList(mainList);您需要制作列表的副本,因为在您的原始代码中,您所做的只是传递一个引用(正如您所怀疑的那样)(有人称它为pointer)。您可以在新列表上调用构造函数,将原始列表作为参数传递:ListSomeOperationFunction(Listtarget){Listresult=newList(target);结果.removeat(3);返回结果;}或者创建一个MemberWiseClone:ListSomeOperationFunction(Listtarget){Listresult=target.MemberWiseClone();结果.removeat(3);返回结果;此外,您没有在任何地方存储SomeOperationFunction的返回值,因此您可能也想修改该部分(您将方法声明为void,它不应返回任何内容,但在其中您将返回一个对象)。您应该这样调用该方法:Listtarget=SomeOperationFunction(mainList);注意:不会复制列表的元素(仅复制它们的引用),因此修改元素的内部状态将影响两个列表。由于List是引用类型,因此传递给函数的是对原始列表的引用。有关如何在C#中传递参数的详细信息,请参阅这篇MSDN文章。为了实现你想要的,你应该在SomeOperationFunction中创建列表的副本,然后返回它。一个简单的例子:voidListSomeOperationFunction(Listtarget){varnewList=newList(target);newList.RemoveAt(3);返回新列表;//returncopyoflist}正如OlivierJacot-Descombes在另一个答案中所说的正如评论中指出的那样,重要的是要记住[...]如果项目是引用类型,则列表仍然包含对同一项目的引用。因此,对项目本身的更改仍会影响两个列表中的项目。以上就是C#学习教程:如何在不改变原列表的情况下,改变新的列表?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: