Почему.ForEach () на IList <T> а не на IEnumerable <T>? [дубликат]

Вы использовали неверное значение в заголовке

static navigationOptions = {
    header: "none"        
};

Замените "none" на null

static navigationOptions = {
        header: null        
};
52
задан fhcimolin 24 June 2019 в 08:49
поделиться

10 ответов

С только что выпущенной Ubuntu 9.04 очень актуальная среда разработки Mono настолько близка:

apt-get install monodevelop

Раньше я соглашался с вами, что было довольно сложно начать работу с Mono, но последняя версия Ubuntu растопила этот барьер. И последняя версия Monodevelop - абсолютная радость в использовании.

Не используете Ubuntu? Тогда я согласился бы с советом Питера об использовании образа VMWare .

переопределяет один для List , но он будет работать для любого другого класса, который реализует IEnumerable .

public static class IEnumerableExtensions
{
  public static void ForEach<T>(this IEnumerable<T> source, Action<T> action)
  {
    foreach (T item in source)
      action(item);
  }
}
38
ответ дан 7 November 2019 в 09:24
поделиться

Because ForEach() on an IEnumerable is just a normal for each loop like this:

for each T item in MyEnumerable
{
    // Action<T> goes here
}
5
ответ дан 7 November 2019 в 09:24
поделиться
​​

Я просто догадываюсь здесь, но установка foreach на IEnumerable заставит операции с ним иметь побочные эффекты. Ни один из «доступных» методов расширения не вызывает побочных эффектов, поэтому использование такого императивного метода, как foreach, не запутает API. Кроме того, foreach инициализировал бы ленивую коллекцию.

Лично я отбивался от соблазна просто добавить свои собственные, просто чтобы отделить функции без побочных эффектов отдельно от функций с побочными эффектами.

3
ответ дан 7 November 2019 в 09:24
поделиться

ForEach нет в IList, он в списке. Вы использовали конкретный список в вашем примере.

2
ответ дан 7 November 2019 в 09:24
поделиться

ForEach is implemented in the concrete class List

0
ответ дан 7 November 2019 в 09:24
поделиться

Просто предположение, но List может перебирать свои элементы без создания перечислителя:

public void ForEach(Action<T> action)
{
    if (action == null)
    {
        ThrowHelper.ThrowArgumentNullException(ExceptionArgument.match);
    }
    for (int i = 0; i < this._size; i++)
    {
        action(this._items[i]);
    }
}

Это может привести к повышению производительности. С IEnumerable у вас нет возможности использовать обычный цикл for.

0
ответ дан 7 November 2019 в 09:24
поделиться

Это называется "Выбрать" на IEnumerable Я просвещен, спасибо.

0
ответ дан 7 November 2019 в 09:24
поделиться

LINQ follows the pull-model and all its (extension) methods should return IEnumerable, except for ToList(). The ToList() is there to end the pull-chain.

ForEach() is from the push-model world.

You can still write your own extension method to do this, as pointed out by Samuel.

0
ответ дан 7 November 2019 в 09:24
поделиться

По словам Эрика Липперта, это в основном по философским причинам . Вам следует прочитать весь пост, но, насколько я понимаю, суть такова:

Я философски против предоставление такого метода для двоих причин.

Первая причина в том, что это нарушает функциональное программирование принципы, что все остальные последовательности операторы основаны на. Ясно единственная цель вызова этого метода вызывает побочные эффекты.

Цель выражения - вычислить значение, чтобы не вызвать побочную эффект. Цель заявления - вызвать побочный эффект. Сайт звонка из этой вещи будет выглядеть ужасно как выражение (хотя, по общему признанию, поскольку метод возвращает пустоту, выражение могло использоваться только в «заявлении» выражение "контекст.)

Мне не нравится делать единственный оператор последовательности это полезно только для его стороны

Вторая причина в том, что это добавляет нулевую новую репрезентативную силу на язык.

39
ответ дан 7 November 2019 в 09:24
поделиться

Честно говоря, я точно не знаю, почему .ForEach (Action) не включен в IEnumerable, но правильно, неправильно или безразлично, так оно и есть ...

Однако я ДЕЙСТВИТЕЛЬНО хотел выделить проблему производительности, упомянутую в других комментариях. Производительность снижается в зависимости от того, как вы перебираете коллекцию. Это относительно незначительно, но тем не менее, безусловно, существует. Вот невероятно быстрый и неаккуратный фрагмент кода, чтобы показать взаимосвязи ... всего за минуту или около того, чтобы его прочесть.

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("Start Loop timing test: loading collection...");
        List<int> l = new List<int>();

        for (long i = 0; i < 60000000; i++)
        {
            l.Add(Convert.ToInt32(i));
        }

        Console.WriteLine("Collection loaded with {0} elements: start timings",l.Count());
        Console.WriteLine("\n<===============================================>\n");
        Console.WriteLine("foreach loop test starting...");

        DateTime start = DateTime.Now;

        //l.ForEach(x => l[x].ToString());

        foreach (int x in l)
            l[x].ToString();

        Console.WriteLine("foreach Loop Time for {0} elements = {1}", l.Count(), DateTime.Now - start);
        Console.WriteLine("\n<===============================================>\n");
        Console.WriteLine("List.ForEach(x => x.action) loop test starting...");

        start = DateTime.Now;

        l.ForEach(x => l[x].ToString());

        Console.WriteLine("List.ForEach(x => x.action) Loop Time for {0} elements = {1}", l.Count(), DateTime.Now - start);
        Console.WriteLine("\n<===============================================>\n");

        Console.WriteLine("for loop test starting...");

        start = DateTime.Now;
        int count = l.Count();
        for (int i = 0; i < count; i++)
        {
            l[i].ToString();
        }

        Console.WriteLine("for Loop Time for {0} elements = {1}", l.Count(), DateTime.Now - start);
        Console.WriteLine("\n<===============================================>\n");

        Console.WriteLine("\n\nPress Enter to continue...");
        Console.ReadLine();
    }

Не зацикливайтесь на этом слишком сильно. Производительность - это валюта дизайна приложения, но если ваше приложение не испытывает фактического снижения производительности, вызывающего проблемы с удобством использования, сосредоточьтесь на кодировании для удобства обслуживания и повторного использования, поскольку время - это валюта реальных бизнес-проектов ...

2
ответ дан 7 November 2019 в 09:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: