CodeJam - библиотека универсальных полезняшек для .NET
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 16.03.16 20:02
Оценка: 2 (1) +2
#Имя: wiki.prj.codejam
Почти у каждого программиста есть в загашнике библиотека, которая присутствует в большинстве его проектов. В ней, как правило, содержится некий набор полезняшек, которые упрощают жизнь, но, по каким то причинам, отсутствуют в фреймворке. При этом они слишком малы и мало связаны по теме, чтобы заводить для них отдельные библиотеки.
Проблема в том, что поддержка одному такой библиотеки занимает какое то время, а когда в одном проекте встречается код разных авторов, функционал ее может дублироваться.
CodeJam это проект по сбору таких полезняшек в одну библиотеку, гарантирующую определенный уровень качества и доступную через nuget.

Исходные коды
Серверные сборки
Первоначальное обсуждение идеи
Автор: AndrewVK
Дата: 15.03.16

CodeJam Roadmap
Nuget-фид с пакетами из ночных сборок
Информация для разработчиков библиотеки
Сгенерированная документация
AVK Blog
Отредактировано 22.03.2016 13:04 AndrewVK . Предыдущая версия . Еще …
Отредактировано 19.03.2016 13:05 AndrewVK (devinfo link) . Предыдущая версия .
Отредактировано 18.03.2016 11:07 AndrewVK . Предыдущая версия .
Отредактировано 17.03.2016 12:48 AndrewVK (Links) . Предыдущая версия .
Отредактировано 16.03.2016 20:40 AndrewVK (Roadmap link) . Предыдущая версия .
Отредактировано 16.03.2016 20:03 AndrewVK . Предыдущая версия .
CodeJam Roadmap
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 16.03.16 20:39
Оценка: +1
#Имя: wiki.codejam.roadmap

Расширения для строки

  • Инфиксные 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

    Расширения для словарей

  • GetOrAdd, AddOrUpdate
  • GetValueOrDefault
  • KeyEqualityComparer

    Кеши, пулы

  • Словарь с ленивой инициализацией элементов, желательно потокобезопасный
  • ObjectPool
  • Memoize

    Расширения для IO

  • TempDir/TempFile/TempStream returns IDisposable

    Алгоритмы

  • lower_bound
  • upper_bound
  • equal_range
  • partition_point

    Прочее

  • Хелпер для сравнения текстовых данных
  • Хелпер для использования 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 Blog
    Отредактировано 01.04.2016 14:24 AndrewVK . Предыдущая версия . Еще …
    Отредактировано 28.03.2016 0:47 AndrewVK . Предыдущая версия .
    Отредактировано 27.03.2016 1:50 AndrewVK . Предыдущая версия .
    Отредактировано 27.03.2016 1:49 AndrewVK . Предыдущая версия .
    Отредактировано 24.03.2016 18:00 AndrewVK . Предыдущая версия .
    Отредактировано 23.03.2016 21:22 AndrewVK . Предыдущая версия .
    Отредактировано 23.03.2016 16:53 AndrewVK . Предыдущая версия .
    Отредактировано 23.03.2016 11:51 Lexey . Предыдущая версия .
    Отредактировано 22.03.2016 23:52 AndrewVK . Предыдущая версия .
    Отредактировано 21.03.2016 23:06 AndrewVK . Предыдущая версия .
    Отредактировано 21.03.2016 0:19 AndrewVK . Предыдущая версия .
    Отредактировано 20.03.2016 23:26 AndrewVK . Предыдущая версия .
    Отредактировано 19.03.2016 22:42 AndrewVK . Предыдущая версия .
    Отредактировано 18.03.2016 23:03 AndrewVK . Предыдущая версия .
    Отредактировано 18.03.2016 21:42 AndrewVK . Предыдущая версия .
    Отредактировано 18.03.2016 21:19 AndrewVK . Предыдущая версия .
    Отредактировано 18.03.2016 19:39 AndrewVK . Предыдущая версия .
    Отредактировано 18.03.2016 0:45 AndrewVK (New feature) . Предыдущая версия .
    Отредактировано 18.03.2016 0:37 AndrewVK (Mark implemented) . Предыдущая версия .
    Отредактировано 18.03.2016 0:06 AndrewVK (Mark implemented) . Предыдущая версия .
    Отредактировано 17.03.2016 22:58 AndrewVK (New features) . Предыдущая версия .
    Отредактировано 17.03.2016 19:41 AndrewVK (Mark implemented) . Предыдущая версия .
    Отредактировано 17.03.2016 12:25 AndrewVK (Mark implemented) . Предыдущая версия .
    Отредактировано 16.03.2016 23:16 AndrewVK (Formatting) . Предыдущая версия .
    Отредактировано 16.03.2016 23:15 AndrewVK (Add TempXXX) . Предыдущая версия .
    Отредактировано 16.03.2016 20:58 AndrewVK (Add some) . Предыдущая версия .
    Отредактировано 16.03.2016 20:42 AndrewVK . Предыдущая версия .
    Отредактировано 16.03.2016 20:39 AndrewVK (Make wiki) . Предыдущая версия .
    Re: CodeJam Roadmap
    От: xy012111  
    Дата: 16.03.16 23:10
    Оценка:
    Здравствуйте, AndrewVK, Вы писали:

    Тут же лучше обсуждать, правильно?

    Компилироваться шестым шарпом будет?

    AVK>Расширения для строки


    Пригодятся ли такие же инфиксные расширения для Array? Все статические методы этого класса, где первым параметром Array или T[]?

    AVK>Расширения для коллекций

    AVK> * AsArray, AsList, AsHashSet

    AsReadOnlyCollection, AsReadOnlyList (по аналогии с Enumerable::AsEnumerable)?

    AVK>Расширения для словарей

    AVK> * GetValueOrDefault

    Для какого типа это будет расширением? Если сделать для IDictionary<,> то не будет работать для IReadOnlyDictionary<,> (и vice versa); если сделать для обоих, то компилятор откажется компилировать вызов у Dictionary<,>

    AVK>Прочее


    Memoize я так понял не нужен?
    Re[2]: CodeJam Roadmap
    От: AndrewVK Россия http://blogs.rsdn.org/avk
    Дата: 16.03.16 23:26
    Оценка:
    Здравствуйте, 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>>
    AVK Blog
    Re[3]: CodeJam Roadmap
    От: xy012111  
    Дата: 16.03.16 23:45
    Оценка:
    Здравствуйте, 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<>
    Re: CodeJam Roadmap
    От: Lexey Россия  
    Дата: 17.03.16 18:50
    Оценка:
    Здравствуйте, AndrewVK, Вы писали:

    Я там пул-реквест завел с изменениями (косметика + фикс обработки ситуации, когда после "равных" чисел нужно продолжать сранение строк) к NaturalStringComparer и 3-мя вопросами в TODO по нему и методу Args(string format....).
    Посмотри, pls.
    "Будь достоин победы" (c) 8th Wizard's rule.
    Re[2]: CodeJam Roadmap
    От: AndrewVK Россия http://blogs.rsdn.org/avk
    Дата: 17.03.16 19:38
    Оценка:
    Здравствуйте, 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>>
    AVK Blog
    Re: CodeJam - библиотека универсальных полезняшек для .NET
    От: α Российская Империя  
    Дата: 17.03.16 19:41
    Оценка:
    Здравствуйте, AndrewVK, Вы писали:

    apache commons (java) вдохновляться планируете?
    Re[2]: CodeJam - библиотека универсальных полезняшек для .NET
    От: AndrewVK Россия http://blogs.rsdn.org/avk
    Дата: 17.03.16 19:57
    Оценка:
    Здравствуйте, ?, Вы писали:

    ?>apache commons (java) вдохновляться планируете?

    Если там есть чем — почему бы нет. Полезное и подходящее по теме спортировать недолго.
    ... << RSDN@Home 1.0.0 alpha 5 rev. 0 on Windows 8 6.2.9200.0>>
    AVK Blog
    Re: CodeJam - библиотека универсальных полезняшек для .NET
    От: Kolesiki  
    Дата: 17.03.16 22:41
    Оценка: +1
    Здравствуйте, AndrewVK, Вы писали:

    AVK>CodeJam это проект по сбору таких полезняшек


    А почему нет ни слова про зависимости от "JetBrains.Annotations"? Что они делают и почему нельзя без них?
    А зачем там сборка подо все мыслимые фрэймворки? Уж если пишешь проект сразу на C#6, то какой смысл собирать под 4.0?
    Re[2]: CodeJam - библиотека универсальных полезняшек для .NET
    От: AndrewVK Россия http://blogs.rsdn.org/avk
    Дата: 17.03.16 23:19
    Оценка:
    Здравствуйте, 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>>
    AVK Blog
    Re: CodeJam - библиотека универсальных полезняшек для .NET
    От: Jack128  
    Дата: 18.03.16 07:02
    Оценка:
    Здравствуйте, AndrewVK, Вы писали:

    А куда замечания/вопросы по либе писать?

    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.

    2)
    В чем смысл этого?? https://github.com/rsdn/CodeJam/blob/778d3cde52d8648279a521f5e675ac5d78d358b9/Main/src/Collections/CollectionExtensions.cs (AsArray/AsList...)
    Может имелось в виду что нить типа такого AsArray<T>(this IEnumerable<T> source) => (source as T[]) ?? source.ToArray() ? тогда было бы полезнее иметь AsReadOnlyList
    Отредактировано 18.03.2016 7:04 Jack128 . Предыдущая версия . Еще …
    Отредактировано 18.03.2016 7:04 Jack128 . Предыдущая версия .
    Re[2]: CodeJam - библиотека универсальных полезняшек для .NET
    От: AndrewVK Россия http://blogs.rsdn.org/avk
    Дата: 18.03.16 07:43
    Оценка:
    Здравствуйте, Jack128, Вы писали:

    J>Почему Concat ?? ИМХО логичнее было бы Append.


    Потому что Enumerable.Concat уже есть.

    J>2)

    J>В чем смысл этого?? https://github.com/rsdn/CodeJam/blob/778d3cde52d8648279a521f5e675ac5d78d358b9/Main/src/Collections/CollectionExtensions.cs (AsArray/AsList...)

    Это лучше к rameel — Re[2]: Проект утилитной библиотечки
    Автор: rameel
    Дата: 16.03.16


    J>Может имелось в виду что нить типа такого AsArray<T>(this IEnumerable<T> source) => (source as T[]) ?? source.ToArray() ?


    Вряд ли. Enumerable.AsEnumerable видел в Fx? Знаешь зачем он нужен?
    ... << RSDN@Home 1.0.0 alpha 5 rev. 0 on Windows 8 6.2.9200.0>>
    AVK Blog
    Re[3]: CodeJam - библиотека универсальных полезняшек для .NET
    От: Jack128  
    Дата: 18.03.16 08:16
    Оценка:
    Здравствуйте, AndrewVK, Вы писали:

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


    J>>Почему Concat ?? ИМХО логичнее было бы Append.


    AVK>Потому что Enumerable.Concat уже есть.


    Эт я понимаю, но вот честно, если б меня спросили:
    "есть метод, который добавляем элемент в начало последовательности, он называется Prepend. Как называется метод который добавляет элемент в конец последовательности?"
    я б вряд ли сказал Concat.

    J>>2)

    J>>В чем смысл этого?? https://github.com/rsdn/CodeJam/blob/778d3cde52d8648279a521f5e675ac5d78d358b9/Main/src/Collections/CollectionExtensions.cs (AsArray/AsList...)

    AVK>Это лучше к rameel — Re[2]: Проект утилитной библиотечки
    Автор: rameel
    Дата: 16.03.16


    Ну так четко же написано:
    >> Разный набор методов типа 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
    От: AndrewVK Россия http://blogs.rsdn.org/avk
    Дата: 18.03.16 08:20
    Оценка:
    Здравствуйте, 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>>
    AVK Blog
    Re[3]: CodeJam Roadmap
    От: rameel https://github.com/rsdn/CodeJam
    Дата: 18.03.16 12:42
    Оценка:
    Здравствуйте, AndrewVK, Вы писали:

    AVK>Насчет названия для формата — тут ХЗ. В моей либе оно FormatStr называется. Args это IT использует, соотв. оно и в linq2db присуствует. Просто Format, к сожалению, назвать нельзя. Если брать текущую терминологию шарпа, то тогда следует обозвать Interpolate по аналогии со string interpolation.


    Видел еще вариант FormatWith
    ... << RSDN@Home 1.0.0 alpha 5 rev. 0>>
    Re[2]: CodeJam - библиотека универсальных полезняшек для .NET
    От: rameel https://github.com/rsdn/CodeJam
    Дата: 18.03.16 12:42
    Оценка:
    Здравствуйте, Jack128, Вы писали:

    J>2)

    J>В чем смысл этого?? https://github.com/rsdn/CodeJam/blob/778d3cde52d8648279a521f5e675ac5d78d358b9/Main/src/Collections/CollectionExtensions.cs (AsArray/AsList...)

    J>Может имелось в виду что нить типа такого AsArray<T>(this IEnumerable<T> source) => (source as T[]) ?? source.ToArray() ?


    Да, так и планировалось, был занят. Сейчас как раз пишу, скоро закоммичу
    ... << RSDN@Home 1.0.0 alpha 5 rev. 0>>
    Re: CodeJam - библиотека универсальных полезняшек для .NET
    От: rameel https://github.com/rsdn/CodeJam
    Дата: 18.03.16 12:44
    Оценка:
    Здравствуйте, AndrewVK, Вы писали:

    Кстати, как заставить решарпер применять локальные настройки проекта? Раньше проблем не замечал, а сейчас что ни делаю, все равно пробелы вместо табов вставляет
    ... << RSDN@Home 1.0.0 alpha 5 rev. 0>>
    Re[3]: CodeJam - библиотека универсальных полезняшек для .NET
    От: AndrewVK Россия http://blogs.rsdn.org/avk
    Дата: 18.03.16 12:52
    Оценка:
    Здравствуйте, rameel, Вы писали:

    R>Да, так и планировалось, был занят. Сейчас как раз пишу, скоро закоммичу


    Тогда имя надо другое. As вводит в заблуждение.
    ... << RSDN@Home 1.0.0 alpha 5 rev. 0 on Windows 8 6.2.9200.0>>
    AVK Blog
    Re[2]: CodeJam - библиотека универсальных полезняшек для .NET
    От: AndrewVK Россия http://blogs.rsdn.org/avk
    Дата: 18.03.16 12:53
    Оценка:
    Здравствуйте, rameel, Вы писали:

    R>Кстати, как заставить решарпер применять локальные настройки проекта? Раньше проблем не замечал, а сейчас что ни делаю, все равно пробелы вместо табов вставляет


    Пробелы — никак, решарпер ими не управляет, это студийная неотключаемая настройка. Возможно упомянутый тут editconfig спасет.
    ... << RSDN@Home 1.0.0 alpha 5 rev. 0 on Windows 8 6.2.9200.0>>
    AVK Blog
    Подождите ...
    Wait...
    Пока на собственное сообщение не было ответов, его можно удалить.