将List传递给方法,修改方法中的列表而不影响原始'

时间:2015-09-12 13:28:24

标签: c# .net list

对不起,如果这个主题看起来很模糊,我会尽可能地总结它,而不知道我试图实现的确切术语。

基本上我有一个列表,然后我调用一个方法

public List<int> myList;

void Start () {
    myList = new List<int>();
    myList.Add (1);
    myList.Add (2);

    doSomething(myList);

    foreach (int i in myList){
        print (i);
    }
}

在我的方法中,我想这样做(例如)

public void doSomething (List<int> myPassedList) 
{

    int A = 5;
    myPassList.Add (A);
    //... And then some other cool code with this modified list
}

但是,我不希望原始列表发生变化,我希望它完全像原来一样。基本上当我将列表传递给方法时,我喜欢列表的副本,每次调用该方法时都会重新创建。

我想看到控制台打印&#39; 1&#39;然后&#39; 2&#39;

但它会打印&#39; 1&#39;,&#39; 2&#39;和&#39; 5&#39;

希望这一切都有道理!非常感谢您的任何帮助

吉姆

5 个答案:

答案 0 :(得分:5)

List是一种引用类型,因此当您将myPassedList作为参数传递给doSomething时,您正在修改原始列表。

您有两个选项,例如调用ToList()或创建新列表,例如:

public void doSomething (List<int> myPassedList) 
{
    List<int> newList = myPassedList.ToList();
    int A = 5;
    newList.Add(A);
    //... And then some other cool code with this modified list
}

原始列表myList将只返回1和2.

答案 1 :(得分:4)

如果您编写的方法适用于列表但不会修改该列表,那么您应通过

代码记录此
public void doSomething ( IEnumerable<int> myPassedValues ) 
{
    List<int> newList = myPassedValues.ToList();
    int A = 5;
    newList.Add(A);
    //... And then some other cool code with this modified list
}

现在,您和其他所有人都会知道,只需阅读声明即可在此方法中修改传递的列表。

答案 2 :(得分:1)

在doSomething()方法中,通过以下方式创建重复列表:

var newList = new List<int>(myPassedList);
int A = 5;
newList.Add (A);

myPassedList不会受到影响

答案 3 :(得分:0)

您只需将所有项目复制到新列表即可。

empty

答案 4 :(得分:-1)

只需克隆功能

中的原始列表即可
    public void doSomething (List<int> myPassedList) 
 {
     List<int> clonedList = myPassedList;

// doing something here with clonedList
     }