Я ищу неизменную альтернативу стандартному методу Collection<T>.Insert(Int32, T)
.
В моем конкретном случае у меня есть такой метод:
IEnumerable<int> Foo(IEnumerable<int> parameter, int index)
{
var copiedParameter = new List<int>(parameter);
copiedParameter.Insert(index, 42);
return copiedParameter;
}
Это, очевидно, довольно утомительнои неэффективно.Мне нужно что-то вроде этого:
IEnumerable<int> Foo(IEnumerable<int> parameter, int index) => parameter.InsertImmutable(index, 42);
Конечно, я мог бы написать такой метод расширения:
public static IEnumerable<T> InsertImmutable<T>(this IEnumerable<T> collection, int index, T value)
{
var copiedCollection = new List<T>(collection);
copiedCollection.Insert(index, value);
return copiedCollection;
}
Но это, очевидно, не очень улучшает ситуацию, простоперемещает проблему в другое место.
Единственный другой способ сделать это, о котором я мог подумать, это что-то вроде этого:
public static IEnumerable<T> InsertImmutable<T>(this IEnumerable<T> collection, int index, T value)
{
var i = 0;
foreach (var item in collection)
{
if (i == index)
yield return value;
yield return item;
i++;
}
}
Однако, это повторяет IEnumerable
, который еще разможет снизить эффективность.
Есть ли лучший, ленивый и неизменный способ сделать это?