我重新发明轮子了吗?

Ami*_*aei 2 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]);
    }
}
Run Code Online (Sandbox Code Playgroud)

样品:

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

结果:APPLE BANANA ORANGE

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

Yur*_*ich 11

fruits = fruits.Select(x => x.ToUpper()).ToList();
Run Code Online (Sandbox Code Playgroud)


SLa*_*aks 9

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

fruits = fruits.ConvertAll(f => f.ToUpper());
Run Code Online (Sandbox Code Playgroud)

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

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

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