219 votes

ToList()-- la création d'une Nouvelle Liste?

Disons que j'ai une classe

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

Et j'ai un List<MyObject>, et j' ToList() puis modifier l'un de l' SimpleInt, mon changement propager à la liste d'origine. En d'autres termes, ce serait la sortie de la méthode suivante?

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;

}

Pourquoi?

P/S: je suis désolé si cela semble évident à trouver. Mais je n'ai pas de compilateur avec moi maintenant...

269voto

LukeH Points 110965

Oui, ToList permettra de créer une nouvelle liste, mais parce que, dans ce cas - MyObject est un type de référence, puis la nouvelle liste contiendra des références pour les mêmes objets que la liste d'origine.

La mise à jour de l' SimpleInt de la propriété d'un objet référencé dans la nouvelle liste sera également affecter l'équivalent de l'objet dans la liste d'origine.

(Si MyObject , a été déclarée struct plutôt qu'un class puis la nouvelle liste contient des copies des éléments dans la liste d'origine, et la mise à jour d'une propriété d'un élément dans la nouvelle liste serait de ne pas affecter l'équivalent de l'élément dans la liste d'origine.)

66voto

Chris S Points 32376

À partir du Réflecteur avais source:

public static List<TSource> ToList<TSource>(this IEnumerable<TSource> source)
{
    if (source == null)
    {
        throw Error.ArgumentNull("source");
    }
    return new List<TSource>(source);
}

Donc oui, l'original de votre liste ne sera pas mis à jour (c'est à dire les ajouts ou suppressions) cependant les objets référencés.

42voto

SLaks Points 391154

ToList toujours créer une nouvelle liste, qui ne sera pas refléter toute modification ultérieure à la collection.

Cependant, il reflète les changements apportés aux objets eux-mêmes (Sauf s'ils sont mutables les structures).

En d'autres termes, si vous remplacez un objet dans la liste d'origine avec un autre objet, l' ToList contiendra toujours le premier objet.
Toutefois, si vous modifiez l'un des objets de la liste d'origine, l' ToList contient toujours les mêmes (modifié) de l'objet.

13voto

LBushkin Points 60611

Oui, il crée une nouvelle liste. C'est par la conception.

La liste contiendra les mêmes résultats que l'original de la séquence énumérable, mais matérialisée dans un persistants (en mémoire) de la collection. Cela vous permet de consommer les résultats à plusieurs reprises, sans encourir le coût de recalculer la séquence.

La beauté de LINQ séquences, c'est qu'ils sont composables. Souvent, l' IEnumerable<T> que vous obtenez est le résultat de la combinaison de plusieurs de filtrage, le tri et/ou des opérations de projection. Les méthodes d'Extension comme ToList() et ToArray() vous permettent de convertir le résultat de la séquence dans une collection standard.

7voto

Preet Sangha Points 39414

Une nouvelle liste est créée, mais les éléments sont des références à l'origine des éléments (comme dans l'original de la liste). Des modifications à la liste elle-même sont indépendants, mais les éléments trouverez le changement dans les deux listes.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X