Я изобретаю колесо? - PullRequest
       4

Я изобретаю колесо?

2 голосов
/ 01 февраля 2011
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

  • Я заново изобретаю колесо или оно уже существует?
  • Может ли Apply быть написано лучше?

Ответы [ 3 ]

11 голосов
/ 01 февраля 2011
fruits = fruits.Select(x => x.ToUpper()).ToList();
9 голосов
/ 01 февраля 2011

Вы создаете версию List<T>.ConvertAll:

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

ConvertAll быстрее, чем Select(...).ToList(), потому что ей никогда не нужно изменять размер списка.

РЕДАКТИРОВАТЬ : Когда вы звоните .Select(...).ToList(), вызов ToList() не знает, насколько большим был первоначальный список.Поэтому он создаст небольшой массив, а затем несколько раз изменит его размер по мере заполнения.
В отличие от этого ConvertAll является частью исходного списка и знает, насколько он большой.Поэтому он может немедленно выделить массив правильного размера, поэтому ему не нужно изменять размер массива.

Ваш метод быстрее, чем любой из них, поскольку вы изменяете список на месте.(Вы никогда не создаете новый список вообще)

1 голос
/ 01 февраля 2011

Оператор LINQ Select делает это.

См. сигнатуры перегрузки :

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