ToList () - создает ли он новый список? - PullRequest
161 голосов
/ 05 мая 2010

Допустим, у меня есть класс

public class MyObject
{
   public int SimpleInt{get;set;}
}

И у меня есть List<MyObject>, и я ToList(), а затем меняю один из SimpleInt, будут ли мои изменения распространены обратно в исходный список. Другими словами, что будет выводом следующего метода?

public void RunChangeList()
{
  var objs = new List<MyObject>(){new MyObject(){SimpleInt=0}};
  var whatInt = ChangeToList(objs );
}
public int ChangeToList(List<MyObject> objects)
{
  var objectList = objects.ToList();
  objectList[0].SimpleInt=5;
  return objects[0].SimpleInt;

}

Почему?

P / S: Извините, если кажется очевидным выяснить. Но сейчас у меня нет компилятора ...

Ответы [ 12 ]

1 голос
/ 11 декабря 2011

Я не вижу в документации нигде, чтобы ToList () всегда гарантированно возвращал новый список. Если IEnumerable является списком, может быть более эффективно проверить это и просто вернуть тот же список.

Беспокойство заключается в том, что иногда вам может потребоваться быть абсолютно уверенным, что возвращенный список соответствует исходному списку! Поскольку Microsoft не документирует, что ToList вернет новый список, мы не можем быть уверены (если кто-то не найдет эту документацию). Это может также измениться в будущем, даже если это работает сейчас.

new List (IEnumerable enumerablestuff) гарантированно возвращает новый список. Я бы использовал это вместо.

1 голос
/ 05 мая 2010
 var objectList = objects.ToList();
  objectList[0].SimpleInt=5;

Это также обновит исходный объект. Новый список будет содержать ссылки на объекты, содержащиеся в нем, так же, как и исходный список. Вы можете изменить элементы либо, и обновление будет отражено в другом.

Теперь при обновлении списка (добавление или удаление элемента), который не будет отражен в другом списке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...