这是将List传递给方法并编辑该List而不修改原始List的唯一方法吗?
class CopyTest1
{
List<int> _myList = new List<int>();
public CopyTest1(List<int> l)
{
foreach (int num in l)
{
_myList.Add(num);
}
_myList.RemoveAt(0); // no effect on original List
}
}
答案 0 :(得分:12)
重复列表:
_myLocalList = new List<int>(_myList);
并在本地列表上执行操作。
答案 1 :(得分:4)
使用AsReadOnly
:
class CopyTest1
{
List<int> _myList = new List<int>();
public CopyTest1(IList<int> l)
{
foreach (int num in l)
{
_myList.Add(num);
}
_myList.RemoveAt(0); // no effect on original List
}
}
并通过CopyTest1(yourList.AsReadOnly())
进行调用。
答案 2 :(得分:2)
还有另一种方式。您可以使用List<T>
的复制构造函数:
List<int> _myList;
public CopyTest1(List<int> l)
{
_myList = new List<int>(l);
}
答案 3 :(得分:1)
将列表中的对象克隆到其他列表并处理此副本
static class Extensions
{
public static IList<T> Clone<T>(this IList<T> listToClone) where T: ICloneable
{
return listToClone.Select(item => (T)item.Clone()).ToList();
}
}
答案 4 :(得分:0)
当您将列表传递给方法时,您将指针传递给所述列表,这就是您在方法中修改它时更改“原始”列表的原因。如果你想要修改列表的副本,你只需要制作一个。在调用CopyTest1的代码中,您可以根据原始列表创建新列表:
public void CallsCopyTest1()
{
var originalList = new List<int>();
var newList = new List<int>(originalList);
var copyTest = new CopyTest1(newList); //Modifies newList not originalList
}
class CopyTest1
{
List<int> _myList = new List<int>();
public CopyTest1(List<int> l)
{
foreach (int num in l)
{
_myList.Add(num);
}
_myList.RemoveAt(0); // no effect on original List
}
}
答案 5 :(得分:-1)
您可以通过引用传递对象,执行以下操作:
public static void ReferenceMethod(ref List<T> myParam) {
...
}
编辑:问题现在已经澄清,OP是在不改变原始列表的方式之后。