Почему не там никакой метод Linq для возврата отличных значений предикатом?

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

Если стек пуст, вы не можете поп, если вы получите стек ошибка переполнения.

Если стек заполнен, вы не можете нажать, если вы получите ошибку переполнения стека.

Таким образом, переполнение стека появляется там, где вы слишком много выделяете стек. Например, в упомянутой рекурсии.

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

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

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

49
задан Keith 6 February 2009 в 11:51
поделиться

2 ответа

Это является раздражающим, конечно. Это - также часть моего проекта "MoreLINQ", на который я должен обратить некоторое внимание в какой-то момент :) Существует много других операций, которые имеют смысл при действии на проекцию, но возвращая оригинал - MaxBy и MinBy приходят на ум.

, Как Вы говорите, легко записать - хотя я предпочитаю, чтобы имя "DistinctBy" соответствовало OrderBy и т.д. Вот моя реализация, если Вам интересно:

    public static IEnumerable<TSource> DistinctBy<TSource, TKey>
        (this IEnumerable<TSource> source,
         Func<TSource, TKey> keySelector)
    {
        return source.DistinctBy(keySelector,
                                 EqualityComparer<TKey>.Default);
    }

    public static IEnumerable<TSource> DistinctBy<TSource, TKey>
        (this IEnumerable<TSource> source,
         Func<TSource, TKey> keySelector,
         IEqualityComparer<TKey> comparer)
    {
        if (source == null)
        {
            throw new ArgumentNullException("source");
        }
        if (keySelector == null)
        {
            throw new ArgumentNullException("keySelector");
        }
        if (comparer == null)
        {
            throw new ArgumentNullException("comparer");
        }
        return DistinctByImpl(source, keySelector, comparer);
    }

    private static IEnumerable<TSource> DistinctByImpl<TSource, TKey>
        (IEnumerable<TSource> source,
         Func<TSource, TKey> keySelector,
         IEqualityComparer<TKey> comparer)
    {
        HashSet<TKey> knownKeys = new HashSet<TKey>(comparer);
        foreach (TSource element in source)
        {
            if (knownKeys.Add(keySelector(element)))
            {
                yield return element;
            }
        }
    }
53
ответ дан Jon Skeet 7 November 2019 в 21:41
поделиться

, Но это кажется грязным.

Это не грязно, это корректно.

  • , Если Вы хотите Distinct Программисты FirstName и существует четыре Amy, какой Вы хотите?
  • , Если Вы Group программисты FirstName и берете First один, затем ясно, что Вы хотите сделать в случае четырех Amy.

я могу только использовать его здесь, потому что у меня есть единственный ключ.

можно сделать, несколько вводят "отличный" с тем же шаблоном:

return myList
  .GroupBy( x => new { x.Url, x.Age } )
  .Select( g => g.First() );
35
ответ дан Amy B 7 November 2019 в 21:41
поделиться
Другие вопросы по тегам:

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