Почти у каждого программиста есть в загашнике библиотека, которая присутствует в большинстве его проектов. В ней, как правило, содержится некий набор полезняшек, которые упрощают жизнь, но, по каким то причинам, отсутствуют в фреймворке. При этом они слишком малы и мало связаны по теме, чтобы заводить для них отдельные библиотеки.
Проблема в том, что поддержка одному такой библиотеки занимает какое то время, а когда в одном проекте встречается код разных авторов, функционал ее может дублироваться.
CodeJam это проект по сбору таких полезняшек в одну библиотеку, гарантирующую определенный уровень качества и доступную через nuget.
Инфиксные IsNullOrEmpty, IsNullOrWhitespace, NotNullNorEmpty, NotNullNorWhitespace Инфиксный Format Инфиксный Join Length, корректно работающий с null NaturalStringComparer Инфиксные формы для char Дополнительные вариации Substring
Расширения для XDocument
RequiredRoot, RequiredElement, RequiredAttribute ElementValue, AttributeValue (required, optional, alternative names, type conversion etc)
Расширения для рефлекшена
GetAssemblyPath GetRequiredResourceStream GetCustomAttribute<T>/GetCustomAttributes<T>/HasCustomAttribute Enum: GetNames<T>, GetValues<T>, IsDefined<T>, Parse<T>, fast GetFlag Advanced Activator.CreateInstance (required and optional parameters, default values etc) Хелперы с использованием Expression по типу infoof для получения PropertyInfo, FieldInfo, MethodInfo и ConstructorInfo плюс для свойств и полей имена и полное имя (включая всю цепочку: a => a.User.Name вернет "User.Name")
Расширения для коллекций
Concat<T>(T singleElement) AsArray, AsList, AsHashSet ToHashSet Инфиксные формы для Array FirstOrDefault with default value Топологическая сортировка MinItem/MaxItem Array.EqualsTo
Хелпер для сравнения текстовых данных Хелпер для использования ReaderWriterLockSlim совместно с using Хелпер для получения экземпляров пустых массивов без создания объекта каждый раз заново Парсер CSV (experimental) Парсер командной строки (experimental) Ассерты ala Code.NotNull(someValue, "someValue"); Factory для Disposable, using(Disposable.Create(()=>OnDispose())) { } Range<T>/CompositeRange<T> (experimental) Небольшой набор для Func & Action. Часто требуется, например при сортировке создавать делегат, который возвращает сам себя: o => o
Хелпер для дампа куска массива байтов в строку и обратно Option<T> Swap TupleStruct
Компилироваться шестым шарпом будет?
AVK>Расширения для строки
Пригодятся ли такие же инфиксные расширения для Array? Все статические методы этого класса, где первым параметром Array или T[]?
AVK>Расширения для коллекций AVK> * AsArray, AsList, AsHashSet
AsReadOnlyCollection, AsReadOnlyList (по аналогии с Enumerable::AsEnumerable)?
AVK>Расширения для словарей AVK> * GetValueOrDefault
Для какого типа это будет расширением? Если сделать для IDictionary<,> то не будет работать для IReadOnlyDictionary<,> (и vice versa); если сделать для обоих, то компилятор откажется компилировать вызов у Dictionary<,>
AVK>Прочее
Здравствуйте, xy012111, Вы писали:
X>Тут же лучше обсуждать, правильно?
Да.
X>Компилироваться шестым шарпом будет?
Народ склоняется к тому.
AVK>>Расширения для строки X>Пригодятся ли такие же инфиксные расширения для Array? Все статические методы этого класса, где первым параметром Array или T[]?
Если практическая польза есть — почему нет?
X>AsReadOnlyCollection, AsReadOnlyList (по аналогии с Enumerable::AsEnumerable)?
Хм, а в каком сценарии такое может быть? Кто неявно RO коллекции возвращает?
AVK>>Расширения для словарей AVK>> * GetValueOrDefault X>Для какого типа это будет расширением? Если сделать для IDictionary<,> то не будет работать для IReadOnlyDictionary<,> (и vice versa); если сделать для обоих, то компилятор откажется компилировать вызов у Dictionary<,>
Почему не откажется?
AVK>>Прочее X>Memoize я так понял не нужен?
Не знаю. В каком виде он предполагается? Хелпер с лямбдой в параметрах или что?
... << RSDN@Home 1.0.0 alpha 5 rev. 0 on Windows 8 6.2.9200.0>>
Здравствуйте, AndrewVK, Вы писали:
X>>AsReadOnlyCollection, AsReadOnlyList (по аналогии с Enumerable::AsEnumerable)? AVK>Хм, а в каком сценарии такое может быть? Кто неявно RO коллекции возвращает?
Когда есть List<string> к примеру или string[], а вернуть нужно KeyValuePair<int, IReadOnlyCollection<string>>. Такой метод кажется лучшим решением, чем тайп-каст.
Кстати, ещё я часто использую тип Pair с расширениями для KeyValuePair самым важным из которых являестя Pair.Create<,>()
AVK>>>Расширения для словарей AVK>>> * GetValueOrDefault X>>Для какого типа это будет расширением? Если сделать для IDictionary<,> то не будет работать для IReadOnlyDictionary<,> (и vice versa); если сделать для обоих, то компилятор откажется компилировать вызов у Dictionary<,> AVK>Почему не откажется?
Не понял. Компилятор как раз откажется.
AVK>>>Прочее X>>Memoize я так понял не нужен? AVK>Не знаю. В каком виде он предполагается? Хелпер с лямбдой в параметрах или что?
Обычно да и с параметрами — какой уровень потокобезопастности нужен, как у Lazy<>
Я там пул-реквест завел с изменениями (косметика + фикс обработки ситуации, когда после "равных" чисел нужно продолжать сранение строк) к NaturalStringComparer и 3-мя вопросами в TODO по нему и методу Args(string format....).
Посмотри, pls.
Здравствуйте, Lexey, Вы писали:
L>Я там пул-реквест завел с изменениями (косметика + фикс обработки ситуации, когда после "равных" чисел нужно продолжать сранение строк) к NaturalStringComparer и 3-мя вопросами в TODO по нему и методу Args(string format....). L>Посмотри, pls.
Посмотрел уже и смержил в мастер.
Касаемо вопросу по компареру — я вообще особо в код не вникал, просто портанул вариант, на который больше всего народ ссылается и убедился что тест проходит. Там Sinix еще на другой вариант ссылку кинул — может там лучше?
Насчет названия для формата — тут ХЗ. В моей либе оно FormatStr называется. Args это IT использует, соотв. оно и в linq2db присуствует. Просто Format, к сожалению, назвать нельзя. Если брать текущую терминологию шарпа, то тогда следует обозвать Interpolate по аналогии со string interpolation.
... << RSDN@Home 1.0.0 alpha 5 rev. 0 on Windows 8 6.2.9200.0>>
Здравствуйте, AndrewVK, Вы писали:
AVK>CodeJam это проект по сбору таких полезняшек
А почему нет ни слова про зависимости от "JetBrains.Annotations"? Что они делают и почему нельзя без них?
А зачем там сборка подо все мыслимые фрэймворки? Уж если пишешь проект сразу на C#6, то какой смысл собирать под 4.0?
Re[2]: CodeJam - библиотека универсальных полезняшек для .NET
Здравствуйте, Kolesiki, Вы писали:
K>А почему нет ни слова про зависимости от "JetBrains.Annotations"? Что они делают и почему нельзя без них?
Потому что без них можно. Это только для тех у кого решарпер.
K>А зачем там сборка подо все мыслимые фрэймворки? Уж если пишешь проект сразу на C#6, то какой смысл собирать под 4.0?
Проект хоть и на C#6, но может использоваться из C#4+.
... << RSDN@Home 1.0.0 alpha 5 rev. 0 on Windows 8 6.2.9200.0>>
1)
public static IEnumerable<T> Prepend<T>(this IEnumerable<T> source, T element)
public static IEnumerable<T> Concat<T>(this IEnumerable<T> source, T element)
Почему Concat ?? ИМХО логичнее было бы Append.
Здравствуйте, AndrewVK, Вы писали:
AVK>Здравствуйте, Jack128, Вы писали:
J>>Почему Concat ?? ИМХО логичнее было бы Append.
AVK>Потому что Enumerable.Concat уже есть.
Ну так четко же написано: >> Разный набор методов типа AsArray, AsList, AsHashSet, помогает избежать ненужной конвертации IEnumerable<T>, если на вход подали объект соответствующего типа
где в текущей реализации избежали тайпкаст — не видно..
J>>Может имелось в виду что нить типа такого AsArray<T>(this IEnumerable<T> source) => (source as T[]) ?? source.ToArray() ?
AVK>Вряд ли. Enumerable.AsEnumerable видел в Fx? Знаешь зачем он нужен?
Чтоб сделать upcast от IQueryable к IEnumerable.
Встречный вопрос: ты много встречал наследников массива??
более того, для юзкейса AsEnumerable критично, что у IQueryable и IEnumerable есть одноименные, совместимые по сигнатуре методы. Нету всех этих условий ни у List'а, ни у массива, ни у HashSet'а.
Кстати, в NET'е есть метод AsQueryable(), его вообще хоть раз кто нить использовал? вот он столь же бесполезен, как и AsList
Re[4]: CodeJam - библиотека универсальных полезняшек для .NET
Здравствуйте, Jack128, Вы писали:
AVK>>Потому что Enumerable.Concat уже есть. J>Эт я понимаю, но вот честно, если б меня спросили: J>"есть метод, который добавляем элемент в начало последовательности, он называется Prepend. Как называется метод который добавляет элемент в конец последовательности?" J>я б вряд ли сказал Concat.
А если бы спросили как называется метод, который упрощает синтаксис метода Concat?
... << RSDN@Home 1.0.0 alpha 5 rev. 0 on Windows 8 6.2.9200.0>>
Здравствуйте, AndrewVK, Вы писали:
AVK>Насчет названия для формата — тут ХЗ. В моей либе оно FormatStr называется. Args это IT использует, соотв. оно и в linq2db присуствует. Просто Format, к сожалению, назвать нельзя. Если брать текущую терминологию шарпа, то тогда следует обозвать Interpolate по аналогии со string interpolation.
Видел еще вариант FormatWith
... << RSDN@Home 1.0.0 alpha 5 rev. 0>>
Re[2]: CodeJam - библиотека универсальных полезняшек для .NET
Кстати, как заставить решарпер применять локальные настройки проекта? Раньше проблем не замечал, а сейчас что ни делаю, все равно пробелы вместо табов вставляет
... << RSDN@Home 1.0.0 alpha 5 rev. 0>>
Re[3]: CodeJam - библиотека универсальных полезняшек для .NET
Здравствуйте, rameel, Вы писали:
R>Кстати, как заставить решарпер применять локальные настройки проекта? Раньше проблем не замечал, а сейчас что ни делаю, все равно пробелы вместо табов вставляет
Пробелы — никак, решарпер ими не управляет, это студийная неотключаемая настройка. Возможно упомянутый тут editconfig спасет.
... << RSDN@Home 1.0.0 alpha 5 rev. 0 on Windows 8 6.2.9200.0>>