Comment puis-je ajouter un élément à une liste et retourne une nouvelle liste
M'a demandé aujourd'hui à cette question:
Comment puis-je ajouter un élément à une liste et retourner cette liste?
Le code pour List<T>.Add(T)
renvoie void. Donc vous ne pouvez pas faire quelque chose comme ceci:
var list = new List<string>{"item1","item2"};
var newList = list.Add("item3");
Ceci est lié à l'utilisation de AutoMapper, bien que la partie n'est pas particulièrement important.
- Pourquoi voulez-vous créer une nouvelle liste? Pourquoi ne pas ajouter à la liste et de garder renvoyant à l'original?
- Le problème, je crois, c'est dans Automapper, au lieu de créer un résolveur personnalisé vous pourriez le faire en une seule ligne:
ForMember(t=>t.Items,options=>options.MapFrom(s=>new List<string>(t.Items).Add(s.Item));
t.Éléments d'une liste existante dans un objet, éventuellement avec des données existantes, cependant, nous voulons juste pour ajouter de la valeur à partir de la source. Malheureusement, cette ligne en particulier exige de votre pour retourner une valeur, de sorte que Automapper pouvez le mettre à la propriété.
Vous devez vous connecter pour publier un commentaire.
Une option est de Linq, avec
Concat
:Typique de Linq la mode,
list
reste le même, etnewList
contient tous les éléments delist
ainsi que les éléments dans la nouvelle liste, dans ce cas il suffit de"item3"
.Vous pouvez ignorer les
.ToList()
de garder leIEnumerable<string>
résultat si cela correspond à votre cas d'utilisation.Si vous vous retrouver à faire cela souvent avec des éléments individuels, vous pouvez utiliser quelque chose comme cette méthode d'extension pour les passer sans les
new[] { ... }
syntaxe:En raison de la
params
de la matrice de l'exemple précédent devient:Assurez-vous de ne pas mélanger cela avec
Union
, qui supprime les doublons. (À la recherche pour les doublons qui est au-dessus que vous ne voulez probablement pas!)Concat
fonction!La réponse à cette question est relativement simple:
List<T>()
a un constructeur qui peut prendre enIEnumerable<T>
(MSDN). En outre, vous pouvez utiliser l'objet setter pour mettre de nouveaux éléments dans la liste.Ainsi, pour un exemple plus compliqué:
Vous pouvez tout simplement faire :
Ou créer votre propre méthode d'extension :
Et de l'utiliser :
Une propriété d'un
ImmutableList<T>
(et d'autres structures de données à partir deSystem.Collections.Immutable
), c'est qu'il n'est pas muter la liste d'origine, il renvoie une autre liste immuable, avec la valeur ajoutée.Donc faire:
Entraînera dans un plat peu profond copié nouvelle liste chaque fois que vous appelez
Add
.List<T>
etImmutableList<T>
pour différentes opérations est très différente, et bien qu'il existe des cas oùList<T>
est plus rapide, c'est celui oùImmutableList<T>
est beaucoup, beaucoup plus rapide, surtout lorsque le premier de la liste est grande.Le plus lisible et maintenable solution est de copier la liste, puis ajouter l'article: