2011-02-01 59 views
2
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

  • 我是不是重新发明轮子,或者这是否存在?
  • 可以套用写得好吗?
+1

结果是:APPEL BANANA ORANGE:P – Ichibann 2011-02-01 15:49:16

回答

9

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

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

ConvertAllSelect(...).ToList()快,因为它从来没有需要调整大小名单。

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

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

+0

但它改变了类型。你能解释一下你最后一部分的含义吗? – 2011-02-01 15:47:46

1

LINQ Select运算符执行此操作。

overload signatures

Select<TSource, TResult>(IEnumerable<TSource>, Func<TSource, TResult>) 
Select<TSource, TResult>(IEnumerable<TSource>, Func<TSource, Int32, TResult>) 
11
fruits = fruits.Select(x => x.ToUpper()).ToList();