Сообщение Re[165]: Тормознутость и кривость linq. Compile-time EDSL DB от 09.07.2016 20:36
Изменено 09.07.2016 20:57 Serginio1
Здравствуйте, Evgeny.Panasyuk, Вы писали:
EP>Здравствуйте, Serginio1, Вы писали:
EP>>>Я вот не думаю что авторы того кода неквалифицированны в C#, тем более там не один человек участвует. И исхожу из этого.
EP>>>Если ты считаешь что они сделали какой-то ужас, то создай тему в соответствующем под-форуме с указанием на недостатки
S>> Это ты считаешь. Мне все равно. Каждый сам решает, что и как. Но это не значит, что с точки зрения выразительности это хорошо.
EP>Так о том и речь что плохо
Но это не говорит о том, что С++ значительно выразительнее C#.
EP>>>>>Непонятно зачем ты патаешься оправдать раздутую реализацию алгоритма (простейшего!) лямбдами, впрочем мне это уже надоело.
S>>>> Я тебе показал реализацию которая компактнее реализации на C#. Ты же сам согласился выше.
EP>>>Какую конкретно реализацию?
S>> Хотошо. Напомню.https://rsdn.ru/forum/philosophy/6489023.1
S>>Или ты её не видел?
EP>А, так ты под реализацией имеешь в виду вызов готового алгоритма?
То, что ты показал это реализация на
http://ru.cppreference.com/w/cpp/algorithm/max_element
Заметь, что если
Если сюда добавить фильтр на null тo это мало будет отличаться от варианта по которому ты считаешь, что С++ значительно выразительнее.
Но на этом делать вывод, что
По алгоритмической выразительности среди мэйнстрима C++ сейчас впереди всех.
Я кстати извинился за 2 раза. Жду от тебя извинений за несколько сотен строк.
EP>Здравствуйте, Serginio1, Вы писали:
EP>>>Я вот не думаю что авторы того кода неквалифицированны в C#, тем более там не один человек участвует. И исхожу из этого.
EP>>>Если ты считаешь что они сделали какой-то ужас, то создай тему в соответствующем под-форуме с указанием на недостатки
S>> Это ты считаешь. Мне все равно. Каждый сам решает, что и как. Но это не значит, что с точки зрения выразительности это хорошо.
EP>Так о том и речь что плохо
Но это не говорит о том, что С++ значительно выразительнее C#.
EP>>>>>Непонятно зачем ты патаешься оправдать раздутую реализацию алгоритма (простейшего!) лямбдами, впрочем мне это уже надоело.
S>>>> Я тебе показал реализацию которая компактнее реализации на C#. Ты же сам согласился выше.
EP>>>Какую конкретно реализацию?
S>> Хотошо. Напомню.https://rsdn.ru/forum/philosophy/6489023.1
Автор: Serginio1
Дата: 01.07.16
Дата: 01.07.16
S>>Или ты её не видел?
EP>А, так ты под реализацией имеешь в виду вызов готового алгоритма?
То, что ты показал это реализация на
http://ru.cppreference.com/w/cpp/algorithm/max_element
Заметь, что если
template<class ForwardIt>
ForwardIt max_element(ForwardIt first, ForwardIt last)
{
if (first == last) {
return last;
}
ForwardIt largest = first;
++first;
for (; first != last; ++first) {
if (*largest < *first) {
largest = first;
}
}
return largest;
}
Если сюда добавить фильтр на null тo это мало будет отличаться от варианта по которому ты считаешь, что С++ значительно выразительнее.
public static TSource MinItem<TSource, TValue>(
[NotNull, InstantHandle] this IEnumerable<TSource> source,
[NotNull, InstantHandle] Func<TSource, TValue> selector,
[CanBeNull] IComparer<TValue> comparer)
{
if (source == null) throw new ArgumentNullException(nameof(source));
if (selector == null) throw new ArgumentNullException(nameof(selector));
if (comparer == null)
comparer = Comparer<TValue>.Default;
var value = default(TValue);
var item = default(TSource);
// Ветка для нуллабле
if (value == null)
{
using (var e = source.GetEnumerator())
{
do
{
if (!e.MoveNext())
return item;
value = selector(e.Current);
item = e.Current;
}
while (value == null);
while (e.MoveNext())
{
var x = selector(e.Current);
if (x != null && comparer.Compare(x, value) < 0)
{
value = x;
item = e.Current;
}
}
}
}
else // Ветка для валуе типов аналогичной С++
// Можно просто применить foreach было бы то же само как и на С++
{
using (var e = source.GetEnumerator())
{
if (!e.MoveNext())
throw NoElementsException();
value = selector(e.Current);
item = e.Current;
while (e.MoveNext())
{
var x = selector(e.Current);
if (comparer.Compare(x, value) < 0)
{
value = x;
item = e.Current;
}
}
}
}
return item;
}
Но на этом делать вывод, что
По алгоритмической выразительности среди мэйнстрима C++ сейчас впереди всех.
даже в данном варианте на C# 30 строк. При этом используя foreach можно сокаратить до С++ кода. Но даже этот вариант меньше чем ты нашел где то сотни строк.Для сравнения C#, свежий пример — на C++ десять строк (+ может несколько wrapper'ов, это максимум десятки строк), на C# — несколько сотен строк кода (è1 + è2) причём включая кодогенетратор, который генерирует èнесколько тысяч строк, а алгоритм-то совсем пустяковый.
Я кстати извинился за 2 раза. Жду от тебя извинений за несколько сотен строк.
Re[165]: Тормознутость и кривость linq. Compile-time EDSL DB
Здравствуйте, Evgeny.Panasyuk, Вы писали:
EP>Здравствуйте, Serginio1, Вы писали:
EP>>>Я вот не думаю что авторы того кода неквалифицированны в C#, тем более там не один человек участвует. И исхожу из этого.
EP>>>Если ты считаешь что они сделали какой-то ужас, то создай тему в соответствующем под-форуме с указанием на недостатки
S>> Это ты считаешь. Мне все равно. Каждый сам решает, что и как. Но это не значит, что с точки зрения выразительности это хорошо.
EP>Так о том и речь что плохо
Но это не говорит о том, что С++ значительно выразительнее C#.
EP>>>>>Непонятно зачем ты патаешься оправдать раздутую реализацию алгоритма (простейшего!) лямбдами, впрочем мне это уже надоело.
S>>>> Я тебе показал реализацию которая компактнее реализации на C#. Ты же сам согласился выше.
EP>>>Какую конкретно реализацию?
S>> Хотошо. Напомню.https://rsdn.ru/forum/philosophy/6489023.1
S>>Или ты её не видел?
EP>А, так ты под реализацией имеешь в виду вызов готового алгоритма?
То, что ты показал это реализация на
http://ru.cppreference.com/w/cpp/algorithm/max_element
Заметь, что если
Если сюда добавить фильтр на null, селектор для значения, компаратор, тo это мало будет отличаться от варианта по которому ты считаешь, что С++ значительно выразительнее.
Ну и разница, что в С++ итераторы это структуры, а на C# энумераторы это классы.
Но на этом делать вывод, что
По алгоритмической выразительности среди мэйнстрима C++ сейчас впереди всех.
Я кстати извинился за 2 раза. Жду от тебя извинений за несколько сотен строк.
EP>Здравствуйте, Serginio1, Вы писали:
EP>>>Я вот не думаю что авторы того кода неквалифицированны в C#, тем более там не один человек участвует. И исхожу из этого.
EP>>>Если ты считаешь что они сделали какой-то ужас, то создай тему в соответствующем под-форуме с указанием на недостатки
S>> Это ты считаешь. Мне все равно. Каждый сам решает, что и как. Но это не значит, что с точки зрения выразительности это хорошо.
EP>Так о том и речь что плохо
Но это не говорит о том, что С++ значительно выразительнее C#.
EP>>>>>Непонятно зачем ты патаешься оправдать раздутую реализацию алгоритма (простейшего!) лямбдами, впрочем мне это уже надоело.
S>>>> Я тебе показал реализацию которая компактнее реализации на C#. Ты же сам согласился выше.
EP>>>Какую конкретно реализацию?
S>> Хотошо. Напомню.https://rsdn.ru/forum/philosophy/6489023.1
Автор: Serginio1
Дата: 01.07.16
Дата: 01.07.16
S>>Или ты её не видел?
EP>А, так ты под реализацией имеешь в виду вызов готового алгоритма?
То, что ты показал это реализация на
http://ru.cppreference.com/w/cpp/algorithm/max_element
Заметь, что если
template<class ForwardIt>
ForwardIt max_element(ForwardIt first, ForwardIt last)
{
if (first == last) {
return last;
}
ForwardIt largest = first;
++first;
for (; first != last; ++first) {
if (*largest < *first) {
largest = first;
}
}
return largest;
}
Если сюда добавить фильтр на null, селектор для значения, компаратор, тo это мало будет отличаться от варианта по которому ты считаешь, что С++ значительно выразительнее.
Ну и разница, что в С++ итераторы это структуры, а на C# энумераторы это классы.
public static TSource MinItem<TSource, TValue>(
[NotNull, InstantHandle] this IEnumerable<TSource> source,
[NotNull, InstantHandle] Func<TSource, TValue> selector,
[CanBeNull] IComparer<TValue> comparer)
{
if (source == null) throw new ArgumentNullException(nameof(source));
if (selector == null) throw new ArgumentNullException(nameof(selector));
if (comparer == null)
comparer = Comparer<TValue>.Default;
var value = default(TValue);
var item = default(TSource);
// Ветка для нуллабле
if (value == null)
{
using (var e = source.GetEnumerator())
{
do
{
if (!e.MoveNext())
return item;
value = selector(e.Current);
item = e.Current;
}
while (value == null);
while (e.MoveNext())
{
var x = selector(e.Current);
if (x != null && comparer.Compare(x, value) < 0)
{
value = x;
item = e.Current;
}
}
}
}
else // Ветка для валуе типов аналогичной С++
// Можно просто применить foreach было бы то же само как и на С++
{
using (var e = source.GetEnumerator())
{
if (!e.MoveNext())
throw NoElementsException();
value = selector(e.Current);
item = e.Current;
while (e.MoveNext())
{
var x = selector(e.Current);
if (comparer.Compare(x, value) < 0)
{
value = x;
item = e.Current;
}
}
}
}
return item;
}
Но на этом делать вывод, что
По алгоритмической выразительности среди мэйнстрима C++ сейчас впереди всех.
даже в данном варианте на C# 30 строк. При этом используя foreach можно сокаратить до С++ кода. Но даже этот вариант меньше чем ты нашел где то сотни строк.Для сравнения C#, свежий пример — на C++ десять строк (+ может несколько wrapper'ов, это максимум десятки строк), на C# — несколько сотен строк кода (è1 + è2) причём включая кодогенетратор, который генерирует èнесколько тысяч строк, а алгоритм-то совсем пустяковый.
Я кстати извинился за 2 раза. Жду от тебя извинений за несколько сотен строк.