Подтвердить что ты не робот

Как добавить элемент в список и вернуть новый список

Мне задали этот вопрос сегодня:

Как добавить элемент в список и вернуть его обратно?

Код List<T>.Add(T) возвращает void. Поэтому вы не можете сделать что-то вроде этого:

var list = new List<string>{"item1","item2"};
var newList = list.Add("item3");

Это связано с использованием AutoMapper, хотя эта часть не особенно важна.

4b9b3361

Ответ 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");