我重新发明轮子了吗?

时间:2011-02-01 15:38:40

标签: c# extension-methods

public static void Apply<T>(this IList<T> source, Func<T, T> func)
{
    for (int i = 0; i < source.Count; i++)
    {
        source[i] = func.Invoke(source[i]);
    }
}

样品:

 List<string> fruits = new List<string> { "ApPel", "BANana", "oRANGE" };
 fruits.Apply((x) => x.ToUpper());

结果:APPLE BANANA ORANGE

  • 我是重新发明轮子还是已经存在?
  • 可以申请写得更好吗?

3 个答案:

答案 0 :(得分:11)

fruits = fruits.Select(x => x.ToUpper()).ToList();

答案 1 :(得分:9)

您正在创建List<T>.ConvertAll的就地版本:

fruits = fruits.ConvertAll(f => f.ToUpper());

ConvertAllSelect(...).ToList()快,因为它永远不需要调整列表大小。

编辑:当您拨打.Select(...).ToList()时,ToList()来电并不知道原始列表有多大。因此,它会创建一个小数组,然后在数组填满时重复调整数组大小 相比之下,ConvertAll是原始列表的一部分,并且知道它有多大。因此,它可以立即分配正确大小的数组,因此它永远不需要调整数组的大小。

您的方法比其中任何一个都快,因为您正在修改列表。 (你永远不会创建一个新的列表)

答案 2 :(得分:1)

LINQ Select运算符执行此操作。

请参阅overload signatures

Select<TSource, TResult>(IEnumerable<TSource>, Func<TSource, TResult>)
Select<TSource, TResult>(IEnumerable<TSource>, Func<TSource, Int32, TResult>)