Передать список методу без изменения исходного списка - PullRequest
5 голосов
/ 10 октября 2011

Является ли это единственным способом передачи Списка в метод и редактирования этого Списка без изменения исходного Списка?

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 ]

12 голосов
/ 10 октября 2011

дублировать список:

_myLocalList = new List<int>(_myList);

и выполните операции с локальным списком.

4 голосов
/ 10 октября 2011

Используйте 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 голосов
/ 10 октября 2011

Есть другой способ. Вы можете использовать конструктор копирования List<T>:

List<int> _myList;
public CopyTest1(List<int> l)
{
    _myList = new List<int>(l);
}
1 голос
/ 10 октября 2011

Клонировать объекты в списке в другой список и работать с этой копией

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 голосов
/ 10 октября 2011

Вы можете передать объект по ссылке, выполнив следующее:

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

РЕДАКТИРОВАТЬ: Вопрос теперь прояснен, ОП был способ не изменить первоначальный список.

0 голосов
/ 10 октября 2011

Когда вы передаете список методу, вы передаете указатель на указанный список, поэтому вы изменяете «оригинальный» список, когда вы изменяете его внутри вашего метода. Если вы хотите изменить копию списка, вам просто нужно сделать ее. В коде, который вызывает 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
    }
}
...