Информация об изменениях

Сообщение Re[3]: 2IT: Предложения по свежим сбросам от 04.05.2016 15:08

Изменено 04.05.2016 15:17 IT

Здравствуйте, Sinix, Вы писали:

S>Криво написал. В общем по-моему и перевода строки тоже не должно быть




S>Я за тюплы, т.к. они будут чаще использоваться. Особенно после c#7. Но эт только моё мнение, подождём остальных


Подождём.

S>>>3.2. После 3.1. рандомный seed можно убрать, он на распределение особо не влияет

IT>>Где именно? В Objects.Random или а GetHashCode компаратора?
S>В GetHashCode компаратора.

Можно вообще выкинуть. Если специалисты так считают.

S>Если оставлять, то надо его получать один раз и запоминать в static-поле (аля EnumHelper.Holder<T>). А то последовательные вызовы несовместимые компареры будут генерить.


Компаратор генерируется только один раз. А само это значение и так сохранятеся навсегда в Expression.Constant. Хотя, если делать компараторы по заданным полям, то проблема может быть.

S>Вариант конечно, но он не все сценарии покрывает. Например, если надо свой comparer в словарик подсунуть или ещё где переиспользовать.

S>В общем ок, пусть тогда висит в списке "добавить, как идеи закончатся"

Да чего там окладывать. Это задача на час. Всего-то чуть расширить существующий код.

S>Если ничего не забыл, то TAccumulate seed отдельным аргументом передаётся. AVK эту перегрузку уже добавил.


Мне вообще вся эта идея с пререгрузками не нравится. Я сделал перегрузку для следующего сценария, если использовать стандартную функцию:

exs.Aggregate((Expression)null, (e1,e2) => e1 == null ? e2 : Expression.AndAlso(e1, e2), e => e ?? Expression.Constant(true));

В результате теперь можно писать так:

exs.AggregateOrDefault(Expression.AndAlso, () => Expression.Constant(true));

Просто и понятно. Есть эффект. А что дадут остальные перегрузки мне непонятно Так что я бы их убрал до возникновения необходимости.
Re[3]: 2IT: Предложения по свежим сбросам
Здравствуйте, Sinix, Вы писали:

S>Криво написал. В общем по-моему и перевода строки тоже не должно быть




S>Я за тюплы, т.к. они будут чаще использоваться. Особенно после c#7. Но эт только моё мнение, подождём остальных


Подождём.

S>>>3.2. После 3.1. рандомный seed можно убрать, он на распределение особо не влияет

IT>>Где именно? В Objects.Random или а GetHashCode компаратора?
S>В GetHashCode компаратора.

Можно вообще выкинуть. Если специалисты так считают.

S>Если оставлять, то надо его получать один раз и запоминать в static-поле (аля EnumHelper.Holder<T>). А то последовательные вызовы несовместимые компареры будут генерить.


Компаратор генерируется только один раз. А само это значение и так сохранятеся навсегда в Expression.Constant. Хотя, если делать компараторы по заданным полям, то проблема может быть.

S>Вариант конечно, но он не все сценарии покрывает. Например, если надо свой comparer в словарик подсунуть или ещё где переиспользовать.

S>В общем ок, пусть тогда висит в списке "добавить, как идеи закончатся"

Да чего там окладывать. Это задача на час. Всего-то чуть расширить существующий код.

S>Если ничего не забыл, то TAccumulate seed отдельным аргументом передаётся. AVK эту перегрузку уже добавил.


Мне вообще вся эта идея с пререгрузками не нравится. Я сделал перегрузку для следующего сценария, если использовать стандартную функцию:

exs.Aggregate((Expression)null, (e1,e2) => e1 == null ? e2 : Expression.AndAlso(e1, e2), e => e ?? Expression.Constant(true));

В результате теперь можно писать так:

exs.AggregateOrDefault(Expression.AndAlso, () => Expression.Constant(true));

Просто и понятно. Есть эффект. А что дадут остальные перегрузки мне непонятно Так что я бы их убрал до возникновения необходимости.

UPDT:

Фактически эта перегрузка есть фикс косяка, когда последовательность пуста, следующей стандартной функции:

        public static TSource Aggregate<TSource>(this IEnumerable<TSource> source, Func<TSource, TSource, TSource> func)
        {
            if (source == null) throw Error.ArgumentNull("source");
            if (func == null) throw Error.ArgumentNull("func");
            using (IEnumerator<TSource> e = source.GetEnumerator()) {
                if (!e.MoveNext()) throw Error.NoElements();
                TSource result = e.Current;
                while (e.MoveNext()) result = func(result, e.Current);
                return result;
            }
        }