复制IEnumerable,替换一个项
本文关键字:一个 IEnumerable 替换 复制 | 更新日期: 2023-09-27 18:07:10
我想复制一个IEnumerable<T>
,其中给定索引处的单个项已被给定值替换。
我定义了下面的方法来做我想做的:
public static IEnumerable<T> ReplaceAt<T>(this IEnumerable<T> source, T item, int index)
{
foreach (T before in source.Take(index))
{
yield return before;
}
yield return item;
foreach (T after in source.Skip(index + 1))
{
yield return after;
}
}
然而,虽然可能很容易理解,但创建两个迭代器似乎"效率低下",其中一个会跳过第一个迭代器已经取过的项。
有更好的方法来定义这个吗?
如何:
public static IEnumerable<T> ReplaceAt<T>(this IEnumerable<T> source, T item, int index)
{
return source.Select((value, i) => index == i ? item : value);
}
不确定效率,但你试过吗?
public static IEnumerable<T> ReplaceAt<T>(this IEnumerable<T> source, T item, int index)
{
return source.Select((x, i) => i == index ? item : x);
}
如果您想要疯狂,您可以手动展开foreach
:
public static IEnumerable<T> ReplaceAt<T>(this IEnumerable<T> source, T item, int index)
{
int itemIndex = 0;
using(var iter = source.GetEnumerator())
{
while(iter.MoveNext())
{
yield return itemIndex++ == index ? item : iter.Current;
}
}
}