Как стать автором
Обновить

Комментарии 42

Так пост действительно вчерашний, просто он был опубликован поздно вечером, что сложилось ощущение, что он сегодняшний.
Прошу прощения, у меня все еще 2012 год закешировался))
1. Конец рабочего дня, начало года, ну вы понимаете…
2. Спасибо, добавил ссылку в пост.
Преобразует последовательность в строку с разделителями (то что обычно приходится делать через нудный Aggregate).

Нет, я все понимаю, но чем string.Join не угодил?
string.Join работает только коллекцией строк. Его реализация, судя по коду, работает с чем угодно (т.к. ToString() есть у любого объекта)
Эм, а зачем? А в том маловероятном случае, когда нужно — select(s => s.ToString()), и все.
«Для общности», я так думаю.

Вообще, как выяснилось, соответствующий метод уже добавлен в Framework начиная с версии 4.0.
На мой взгляд и string.Join, и Aggregate по-своему некрасивы (я использовал Aggregate в LINQ-выражениях для единообразия). Вариант Скита — самый лаконичный.
Ооо, класс!
Особенно радуют Split, TakeEvery, Prepend, DistinctBy, Batch.
А вот с ForEach не очень понял, в чем отличие от стандартного линковского?
А вот с ForEach не очень понял, в чем отличие от стандартного линковского?

«Стандартного линковского» не существует.
А я-то думал, что ForEach — метод расширения и всем коллекциям доступен. А оказывается только List'у. Эх. Еще одно грустное открытие. :-)
Почему грустное то? Раз вы про это не знали, то значит и проблем с этим не было, а если возникнут — вы теперь в курсе, как это легко решить )
Да я привык обычным foreach проходиться, но знал, что есть и такой вот вариант — альтернативный через метод. А теперь мой мир порушен. :-)
Мне кажется, наоборот — хорошо. «Когда в руке молоток — всё кажется гвоздём» — часто вижу когда в подобные ФорИчи втыкают несколько-строчные лямбды — Ну почему не воспользоваться нормальным человеческим foreach?
в LINQ короче запись получается. И если глаз натренирован, код компактнее получается, незахламленный «правильной структурой языка».
Также он нарушает purity присущую всем LINQ методам расширениям, и гораздо хуже выражает intention изменения данных.
НУ и очевидно дублирует классический foreach.

Лучше бы и у листа не было.
Плюс еще в лямбдах не должно быть сайд эффектов
Совершенно верно. Это всё идёт из фундаментальных принципов ФП. А ребята пекутся о выравнивании буковок в IDE.
Нужно отталкиваться от удобочитаемости. Если логика обработки каждой записи достаточно сложная, то конечно же лучше использовать классический foreach. Если же нужно сделать что-то простое вроде emails.ForEach(m => SendMail(m)) (а еще лучше — emails.ForEach(SendMail)) — то LINQ гораздо лаконичней.
Лучше исходить из того что side-effect-less код можно совать в лямбды extension-методов LINQ, а то что вы написали — нет.
Если воспринимать linq только по его последней букве q от query, то да, код, который исходную последовательность может изменить туда лучше не ставить, и да, ForEach тогда не нужен, ибо это практически его предназначение. А если этот метод воспринимать не как один из запросов, а как инкапсулированный обычный foreach, и использовать его для того, чтобы код был более читаемым и менее громоздким — почему бы и нет. В сочетании с другими операторами линка, записанными одной последовательностью через точку это выглядит гармоничнее, чем обычный foreach.
>Особенно после вчерашнего поста юзера SergeyT

Пост прошлогодний, глобально же вы мыслите :)

Что касается библиотек на .NET от Джона Скита, ещё вполне интересны protobuf-csharp-port и unconstrained-melody.

Первая понятно о чём (кстати, есть более активно развивающаяся альтернатива — protobuf-net), а вторая позволяет задавать нетипичные ограничения для generics.
Правда сложилось так, что ни одним из них сам не пользовался, но имею в виду, если попадётся подходящая задача.
>Особенно после вчерашнего поста юзера SergeyT

Пост прошлогодний, глобально же вы мыслите :)

Спасибо, поправил =)
>>Index Возвращает последовательность пар индекс-значение.
Select из коробки так умеет (одна из его перегрузок)
Очень полезно, спасибо. Например, ЗИПа нет под WP, пришлось брать реализацию из Скитовского же Reimplementing LINQ to Objects, а тут сразу такая библиотечка. Странно, что раньше ее не заметил.
Я думаю многим читателям блога .Net знакомо имя John Skeet.

Jon Skeet пишется без «h», фишка у него такая.
Могу ошибаться, но полагаю, что Jon без «h» потому, что он не Джон, а Джонатан (jonathan). По крайней мере здесь.
Fixed.
У команды Rx есть Ix (Interactive extensions), доступный в NuGet. Там есть EnumerableEx, который всё то, что есть в Rx для IQueryable повторяет для IEnumerable. Ну так вот там списочек расширений подлиннее немного.
А morelinq посмотрим, спасибо.
Полезная библиотека. Не придется теперь создавать свои велосипеды.
Не совсем понятен смысл DistinctBy().
Пример:
List<int> list = new List<int>() { 1, 3, 4, 5, 7, 8, 23 };
List<int> numbers = list.DistinctBy(x => x > 5).ToList();
В результате numbers содержит две цифры: 1 и 7, хотя должен содержать только цифру 7.
Нет, просто перевод неточен.
Потому что с переводом налажали. В реальности там для каждого элемента последовательности применяется описанное преобразование и берутся те элементы (я так понимаю, что первые), у которых различаются результаты преобразования.

В вашем случае это преобразование, которое возвращает true для всех элементов больше 5 и false для всех остальных. Результат понятен.
Нет. Уникальные по значению предиката.
1 — false, берем
3..5 — false пропускаются
7 — true, пропускаем
8..29 — true, пропускаем.
Спасибо. Прояснили. Только в вашем комментарии ошибка 7- truе, берем.
Это не предикат, а проекция.
К слову о слове «проекция»: я специально погуглил, когда писал статью, и не увидел употребления этого слова в русскоязычном сообществе. Я не там искал?
Не задумывался об этом, просто перевел термин с английского.
Хорошая библиотека, надо брать. Сразу навскидку — оператора ForEach сильно не хватало. Приходилось делать Select, возвращать что-нибудь ненужное и результат выполнения никуда не класть. Не покидало гадливое чувство кривости получившегося кода. Все хотел свой extension метод писать, но как то руки не доходили.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории