复制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;
    }
}

然而,虽然可能很容易理解,但创建两个迭代器似乎"效率低下",其中一个会跳过第一个迭代器已经取过的项。

有更好的方法来定义这个吗?

复制IEnumerable,替换一个项

如何:

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;
        }
    }
}