猿问

ToList() - 它是否创建新列表?

假设我有一堂课


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:如果发现它似乎很明显,我很抱歉。但我现在没有编译器...


慕田峪7331174
浏览 1142回答 3
3回答

白猪掌柜的

是的,ToList将创建一个新列表,但因为在这种情况下MyObject是一个引用类型,所以新列表将包含对与原始列表相同的对象的引用。更新SimpleInt新列表中引用的对象的属性也会影响原始列表中的等效对象。(如果MyObject声明为a struct而不是a,class则新列表将包含原始列表中元素的副本,并且更新新列表中元素的属性不会影响原始列表中的等效元素。)

慕娘9325324

来自Reflector'd来源:public static List<TSource> ToList<TSource>(this IEnumerable<TSource> source){&nbsp; &nbsp; if (source == null)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; throw Error.ArgumentNull("source");&nbsp; &nbsp; }&nbsp; &nbsp; return new List<TSource>(source);}所以是的,您的原始列表将不会更新(即添加或删除),但引用的对象将会更新。

繁华开满天机

ToList 将始终创建一个新列表,该列表不会反映对集合的任何后续更改。但是,它会反映对象本身的变化(除非它们是可变的结构)。换句话说,如果使用其他对象替换原始列表中的对象,ToList则仍将包含第一个对象。但是,如果修改原始列表中的某个对象,ToList则仍将包含相同(已修改)的对象。
随时随地看视频慕课网APP
我要回答