LINQ & Except
От: Tom Россия http://www.RSDN.ru
Дата: 10.06.09 13:13
Оценка:
Всем привет,

Вопрос, можно как то ещё упростить такой вот запрос:

var servicesInDatabase = new List<string>() {"s1", "s2", "s3", "s10"};
var servicesLocal = new List<string>() { "s1", "s2", "s4", "s5"};

servicesInDatabase.Except(servicesLocal).ToList().ForEach(Console.WriteLine /*Actually we'to DELETE services here*/);
servicesLocal.Except(servicesInDatabase).ToList().ForEach(Console.WriteLine /*Actually we'to CREATE services here*/);
Народная мудрось
всем все никому ничего(с).
Re: LINQ & Except
От: Tom Россия http://www.RSDN.ru
Дата: 10.06.09 13:18
Оценка:
Собственно вопрос в том, можно ли обьединить два запроса в один, и будет ли это понятнее
Народная мудрось
всем все никому ничего(с).
Re: LINQ & Except
От: Smarty Россия  
Дата: 10.06.09 13:23
Оценка:
Здравствуйте, Tom, Вы писали:

Tom>Всем привет,


Tom>Вопрос, можно как то ещё упростить такой вот запрос:


Tom>
Tom>var servicesInDatabase = new List<string>() {"s1", "s2", "s3", "s10"};
Tom>var servicesLocal = new List<string>() { "s1", "s2", "s4", "s5"};

Tom>servicesInDatabase.Except(servicesLocal).ToList().ForEach(Console.WriteLine /*Actually we'to DELETE services here*/);
Tom>servicesLocal.Except(servicesInDatabase).ToList().ForEach(Console.WriteLine /*Actually we'to CREATE services here*/);

Tom>


Ну поскольку какое-никакое решение уже предложено, резонно задаться вопросом — а с чем боремся, почему оно плохо? Хотим что бы быстрее+меньше кода? Что бы проще для написания? Что бы гибкость выше была? Или что?
Re[2]: LINQ & Except
От: Tom Россия http://www.RSDN.ru
Дата: 10.06.09 14:27
Оценка:
S>Ну поскольку какое-никакое решение уже предложено, резонно задаться вопросом — а с чем боремся, почему оно плохо? Хотим что бы быстрее+меньше кода? Что бы проще для написания? Что бы гибкость выше была? Или что?
Хочется что бы был один запрос
Народная мудрось
всем все никому ничего(с).
Re[3]: LINQ & Except
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 10.06.09 15:04
Оценка:
Здравствуйте, Tom, Вы писали:
Tom>Хочется что бы был один запрос
Странно, что Симметрической разности над множествами нет, достаточно просто реализуемая при сравнении сортрованных множеств.
и солнце б утром не вставало, когда бы не было меня
Re: LINQ & Except
От: Воронков Василий Россия  
Дата: 10.06.09 15:13
Оценка:
Здравствуйте, Tom, Вы писали:

Tom>
Tom>var servicesInDatabase = new List<string>() {"s1", "s2", "s3", "s10"};
Tom>var servicesLocal = new List<string>() { "s1", "s2", "s4", "s5"};

Tom>servicesInDatabase.Except(servicesLocal).ToList().ForEach(Console.WriteLine /*Actually we'to DELETE services here*/);
Tom>servicesLocal.Except(servicesInDatabase).ToList().ForEach(Console.WriteLine /*Actually we'to CREATE services here*/);
Tom>


Вообще касательно ForEach я потихоньку пришел к выводу, что не грех самом деле свой ForEach написать. С т.з. лаконичности кода это окупиться сто раз, к тому же часто приходится работать и с коллекциями, которые восходят к не-генерик интерфейсам — и можно сделать универсальную реализацию, которая позволит избежать лишних преобразований.
Re[3]: LINQ & Except
От: Smarty Россия  
Дата: 10.06.09 15:46
Оценка: +1
Здравствуйте, Tom, Вы писали:

S>>Ну поскольку какое-никакое решение уже предложено, резонно задаться вопросом — а с чем боремся, почему оно плохо? Хотим что бы быстрее+меньше кода? Что бы проще для написания? Что бы гибкость выше была? Или что?

Tom>Хочется что бы был один запрос

Не, один запрос — это тут без мазы. Вот одна строка кода — лехко, к примеру:

servicesInDatabase.Concat(servicesLocal).Except(servicesInDatabase.Intersect(servicesLocal)).ToList().ForEach(Console.WriteLine);


Но нафига ж такие извращения?? По-моему 2 строки вдвое понятнее...
Re[2]: LINQ & Except
От: IB Австрия http://rsdn.ru
Дата: 10.06.09 16:27
Оценка: 26 (1) +2
Здравствуйте, Воронков Василий, Вы писали:

ВВ>Вообще касательно ForEach я потихоньку пришел к выводу, что не грех самом деле свой ForEach написать. С т.з. лаконичности кода это окупиться сто раз, к тому же часто приходится работать и с коллекциями, которые восходят к не-генерик интерфейсам — и можно сделать универсальную реализацию, которая позволит избежать лишних преобразований.


http://blogs.msdn.com/ericlippert/archive/2009/05/18/foreach-vs-foreach.aspx
... << RSDN@Home 1.2.0 alpha 4 rev. 1082>>
Мы уже победили, просто это еще не так заметно...
Re[3]: LINQ & Except
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 10.06.09 16:32
Оценка:
Здравствуйте, IB, Вы писали:



IB>http://blogs.msdn.com/ericlippert/archive/2009/05/18/foreach-vs-foreach.aspx

А синклер значит зря старается
http://blogs.msdn.com/ruericlippert/archive/2009/05/18/foreach-foreach.aspx
и солнце б утром не вставало, когда бы не было меня
Re[3]: LINQ & Except
От: Воронков Василий Россия  
Дата: 10.06.09 16:53
Оценка: -1 :)
Здравствуйте, IB, Вы писали:

IB>http://blogs.msdn.com/ericlippert/archive/2009/05/18/foreach-vs-foreach.aspx


Ну и что? Там высказано частное мнение, что ForEach в таком виде это вообще плохо. Основная причина, что противоречит принципам функционального программирования. Я как-то не припомню, чтобы C# стал pure functional language. Лично мне запись вида:

list.ForEach(x => DoSmth(x), x => Condition(x));


импонирует больше, чем:

foreach (var x in list)
  if (Condition(x))
    DoSmth(x);
Re[4]: LINQ & Except
От: Lloyd Россия  
Дата: 10.06.09 21:29
Оценка:
Здравствуйте, Воронков Василий, Вы писали:

ВВ>импонирует больше, чем:


ВВ>
ВВ>foreach (var x in list)
ВВ>  if (Condition(x))
ВВ>    DoSmth(x);
ВВ>


А если
foreach (var x in list.Where(Condition))DoSmth(x);
Re[5]: LINQ & Except
От: Воронков Василий Россия  
Дата: 10.06.09 22:51
Оценка: :)
Здравствуйте, Lloyd, Вы писали:

ВВ>>
ВВ>>foreach (var x in list)
ВВ>>  if (Condition(x))
ВВ>>    DoSmth(x);
ВВ>>


L>А если

L>
L>foreach (var x in list.Where(Condition))DoSmth(x);
L>


Ну если оперировать теми же аргументами, что и в приведенном здесь блоге, то этот вариант практически идентичен вышеприведенному — ведь кол-во символов практически то же:

foreach (var x in list) if (Condition(x)) DoSmth(x);

foreach (var x in list.Where(Condition)) DoSmth(x);


Нет, шорт! В первом случае на один символ даже меньше

Вывод, мне кажется, каждый делает сам..
Re: LINQ & Except
От: Sinix  
Дата: 11.06.09 00:55
Оценка: +1
Здравствуйте, Tom

Tom>Вопрос, можно как то ещё упростить такой вот запрос:


Во-первых используем HashSet. Во-вторых не мешаем императивщину с функциональным стилем. То что в языке появилась ФИЧА не означает что фичу надо пихать куда попало.

А то тут уже linq к парсингу строк прикрутить пытались.
Re[4]: LINQ & Except
От: Ziaw Россия  
Дата: 11.06.09 05:12
Оценка:
Здравствуйте, Воронков Василий, Вы писали:

Чтобы понять код:

ВВ>
ВВ>list.ForEach(x => DoSmth(x), x => Condition(x));
ВВ>


надо знать внутреннюю реализацию ForEach, судя по эквивалентному коду она не интуитивна.

ВВ>
ВВ>foreach (var x in list)
ВВ>  if (Condition(x))
ВВ>    DoSmth(x);
ВВ>


Если же в ForEach оставить только экшен — у него не останется преимуществ перед foreach.
... << RSDN@Home 1.2.0 alpha 4 rev. 1176>>
Re[5]: LINQ & Except
От: Воронков Василий Россия  
Дата: 11.06.09 07:52
Оценка:
Здравствуйте, Ziaw, Вы писали:

Z>надо знать внутреннюю реализацию ForEach, судя по эквивалентному коду она не интуитивна.


У вас какая-то избирательная интуиция. Where(condition) — интуитивно-понятно, а ForEach(action, condition) — нет.

ВВ>>
ВВ>>foreach (var x in list)
ВВ>>  if (Condition(x))
ВВ>>    DoSmth(x);
ВВ>>


Z>Если же в ForEach оставить только экшен — у него не останется преимуществ перед foreach.


Почему? Кода меньше не становится?
Re[3]: LINQ & Except
От: Jack128  
Дата: 11.06.09 07:53
Оценка: -1
Здравствуйте, IB, Вы писали:

IB>Здравствуйте, Воронков Василий, Вы писали:


ВВ>>Вообще касательно ForEach я потихоньку пришел к выводу, что не грех самом деле свой ForEach написать. С т.з. лаконичности кода это окупиться сто раз, к тому же часто приходится работать и с коллекциями, которые восходят к не-генерик интерфейсам — и можно сделать универсальную реализацию, которая позволит избежать лишних преобразований.


IB>http://blogs.msdn.com/ericlippert/archive/2009/05/18/foreach-vs-foreach.aspx


А зачем тогда сделали ForEach для листа???

ЗЫ Лудше безобразно, зато единообразно.
Re[4]: LINQ & Except
От: Ziggi111 Россия  
Дата: 11.06.09 07:56
Оценка: +1
Здравствуйте, Serginio1, Вы писали:

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




IB>>http://blogs.msdn.com/ericlippert/archive/2009/05/18/foreach-vs-foreach.aspx

S> А синклер значит зря старается
S>http://blogs.msdn.com/ruericlippert/archive/2009/05/18/foreach-foreach.aspx
Синклеру БОЛЬШОЕ ЧЕЛОВЕЧЕСКОЕ СПАСИБО!!!!!
Re[6]: LINQ & Except
От: Ziaw Россия  
Дата: 11.06.09 07:56
Оценка:
Здравствуйте, Воронков Василий, Вы писали:

ВВ>Почему? Кода меньше не становится?


А какие еще преимущества у такой записи?
... << RSDN@Home 1.2.0 alpha 4 rev. 1176>>
Re[4]: LINQ & Except
От: Ziggi111 Россия  
Дата: 11.06.09 07:59
Оценка:
Здравствуйте, Воронков Василий, Вы писали:

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


IB>>http://blogs.msdn.com/ericlippert/archive/2009/05/18/foreach-vs-foreach.aspx


ВВ>Ну и что? Там высказано частное мнение, что ForEach в таком виде это вообще плохо. Основная причина, что противоречит принципам функционального программирования. Я как-то не припомню, чтобы C# стал pure functional language. Лично мне запись вида:


ВВ>
ВВ>list.ForEach(x => DoSmth(x), x => Condition(x));
ВВ>


ВВ>импонирует больше, чем:


ВВ>
ВВ>foreach (var x in list)
ВВ>  if (Condition(x))
ВВ>    DoSmth(x);
ВВ>


ИМХО
list.ForEach(x => DoSmth(x), x => Condition(x));

читается не лучше, но, как и сказано в указанном блоге, недебагебелбно
Re[7]: LINQ & Except
От: Воронков Василий Россия  
Дата: 11.06.09 08:11
Оценка:
Здравствуйте, Ziaw, Вы писали:

ВВ>>Почему? Кода меньше не становится?

Z>А какие еще преимущества у такой записи?

Я уже говорил — тут каждый выводы делает сам

На мой взгляд преимущество тут точно такое же как и у простого Where(x => Condition(x)) перед if (Condition(x)) {} — когда "букаф" даже больше получается.

Ну и давайте вспомним такую штуку как однообразность кода. Если я в одном месте использую ForEach, то и в другом, в аналогичной ситуации, хотелось бы тоже.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.