Здравствуйте, IT, Вы писали:
S>>В exception.GetText() есть мелкий косяк: в конце текста всегда пустая строка.
IT>Не всегда. Только после FusionLog была пустая строка, в остальных слочаях только перевод строки. Исправлю.
Криво написал. В общем по-моему и перевода строки тоже не должно быть
S>>3.1. Надо бы использовать HashCode.Combine() — там используется стандартный алгоритм из Tuple.
IT>То что генерируется сейчас есть стандартный код анонимных типов. Мне в принцмпе по барабану, что скажете то и сгенерируем.
Ага, мой фейл
Я за тюплы, т.к. они будут чаще использоваться. Особенно после c#7. Но эт только моё мнение, подождём остальных
S>>3.2. После 3.1. рандомный seed можно убрать, он на распределение особо не влияет
IT>Где именно? В Objects.Random или а GetHashCode компаратора?
В GetHashCode компаратора.
Если оставлять, то надо его получать один раз и запоминать в static-поле (аля
EnumHelper.Holder<T>). А то последовательные вызовы несовместимые компареры будут генерить.
S>>3.3. Было бы круто допилить comparer под реальные сценарии — в 99.99% случаев надо сравнивать по определённым полям. Ну, т.е. нужен builder с синтаксисом аля
IT>Это легко делается с помощью анонимных типов.
Вариант конечно, но он не все сценарии покрывает. Например, если надо свой comparer в словарик подсунуть или ещё где переиспользовать.
В общем ок, пусть тогда висит в списке "добавить, как идеи закончатся"
S>>И, возможно, закинуть методы для компарера в Operators<T>, сам код с генерацией — в OperatorsFactory<T> — но это только как всё устаканится.
IT>Я исходил из соображений того, что EqualityComparer находится в System.Collections.Generic, поэтому положил всё в Collections.
Ага, с этой точки зрения фигню предложил. Вычёркиваем.
S>>3.4. С учётом 3.3. А не замахнуться ли по аналогии ещё и на IComparer<T>?
IT>Да без проблем. Пожелания отдельным списочком и усё будет у порядке, даже лучше!
Ок, тоже к списку добавлю.
S>>4. AggregateOrDefault — надо бы докинуть перегрузки с TAccumulate, как в стандартном Aggregate().
IT>Я это даже сделал, потом выкинул. Там получается нужно первый элемент всегда преобразовывать к TAccumulate. Если это устраивает, то добавлю.
Если ничего не забыл, то TAccumulate seed отдельным аргументом передаётся. AVK эту перегрузку
уже добавил.
IT>Кстати, замена is на as по моему не лучшая идея, т.к. оставляет лишнюю переменную в области видимости где она больше ни разу не используется. А последующей логике ещё и добавляет уровни вложенности. Сравни:
А это решарпер насоветовал. Я это место видел, если бы сам правил — 100% оставил бы как есть.
Спорить как правильно не возьмусь, т.к. у меня очень предвзятое мнение по поводу аналайзеров r#, в основном нецензурное