将List传递给方法而不修改原始列表

时间:2011-10-10 12:36:22

标签: c# list pass-by-reference

这是将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
    }
}

6 个答案:

答案 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是在不改变原始列表的方式之后。