不修改原始列表的情况下将列表传递给方法

10

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

这是一种将List传递给方法并编辑该List而不修改原始List的方式吗? - Bastardo
6个回答

18

复制列表:

_myLocalList = new List<int>(_myList);

并在本地列表上执行操作。


6

使用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()) 调用它。


3

还有一种方法。你可以使用 List<T> 的复制构造函数:

List<int> _myList;
public CopyTest1(List<int> l)
{
    _myList = new List<int>(l);
}

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();
        }
}

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
    }
}

如果调用者忘记创建副本,则会导致意外行为 - 我希望类/方法处理它。 - Paligulus
这取决于类的目的,是用来修改一个集合还是创建集合的副本并对其进行修改?这个例子有点牵强,我不认为你想要的意图很明显。 - Simon Stender Boisen

-1

以下是通过引用传递对象的方法:

public static void ReferenceMethod(ref List<T> myParam) {
    ...
} 

编辑:问题现在已经澄清,原帖作者想要一种不改变原始列表的方法。


无论如何,没有必要将其作为“ref”传递以更改原始列表 - “ref”允许您更改调用者范围中的引用以指向另一个对象,这是极不可能有用的。 - newacct

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接