Как добавить элемент в список и вернуть новый список
Мне задали этот вопрос сегодня:
Как добавить элемент в список и вернуть его обратно?
Код List<T>.Add(T)
возвращает void. Поэтому вы не можете сделать что-то вроде этого:
var list = new List<string>{"item1","item2"};
var newList = list.Add("item3");
Это связано с использованием AutoMapper, хотя эта часть не особенно важна.
Ответы
Ответ 1
Один из вариантов - Linq, Concat
:
var list = new List<string>{"item1", "item2"};
var newList = list.Concat(new[] { "item3" }).ToList();
В типичном стиле Linq list
остается неизменным, а newList
содержит все элементы из list
, а также элементы в новом списке, в этом случае просто "item3"
.
Вы можете пропустить .ToList()
, чтобы сохранить результат IEnumerable<string>
, если это соответствует вашему прецеденту.
Если вы часто делаете это с отдельными элементами, вы можете использовать что-то вроде этого метода расширения, чтобы передать их без синтаксиса new[] { ... }
:
public static IEnumerable<T> ConcatItems<T>(this IEnumerable<T> source, params T[] items)
{
return source.Concat(items);
}
Из-за массива params
более ранний пример:
var list = new List<string>{"item1", "item2"};
var newList = list.ConcatItems("item3").ToList();
Обязательно не смешивать это с Union
, который удаляет повторяющиеся элементы. (Поиск этих дубликатов - это накладные расходы, которые вы, вероятно, не хотите!)
Ответ 2
Ответ на этот вопрос был относительно прост:
var list = new List<string>(new List<string>{"item1","item2"}){"item3"};
List<T>()
имеет конструктор, который может принимать IEnumerable<T>
(MSDN). Кроме того, вы можете использовать установщик объектов для размещения новых элементов в списке.
Итак, для более сложного примера:
var originalList = new List<string>();
originalList.Add("item1");
originalList.Add("item2");
var newList = new List<string>(originalList){"item3"};
Ответ 3
Вы можете просто сделать:
List<string> list = new List<string>{"item1","item2"};
List<string> newList = null;
(newList = list.ToList()).Add("item3");
Или создайте свой собственный метод расширения:
public static class Helper
{
public static List<T> MyAdd<T>(this List<T> collection, T item)
{
collection.Add(item);
return collection;
}
}
И используйте его:
List<string> list = new List<string>{"item1","item2"};
List<string> newList = list.MyAdd("item3"); // same object though
List<string> newList2 = newList.ToList().MyAdd("item4").MyAdd("item5"); // different object
Ответ 4
Одно свойство ImmutableList<T>
(и другие подобные структуры данных из System.Collections.Immutable
) состоит в том, что он не мутирует исходный список, он возвращает еще один неизменный список с добавленным значением.
Таким образом:
var originalImmutable = ImmutableList<int>.Create(1, 2);
var otherImmutable = originalImmutable.Add(3);
При вызове Add
будет вызываться нечеткий скопированный новый список.
Ответ 5
Наиболее читаемым и поддерживаемым решением является копирование списка, а затем добавление элемента:
var list = new List<string>{"item1","item2"};
var newList = list.toList();
newList.Add("item3");