Информация об изменениях

Сообщение Re[175]: Тормознутость и кривость linq. Compile-time EDSL DB от 10.07.2016 11:03

Изменено 10.07.2016 11:24 Serginio1

Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>Здравствуйте, Ночной Смотрящий, Вы писали:


EP>>>Причины могут быть какие угодные. Я же например не говорю что авторы в рамках языка/платформы неправильно поступили. Я говорю что плох тот языка/платформа на которых необходимы такие извраты для простейших алгоритмов

НС>>Извраты необходимы не из-за платформы/языка, а из-за предметной области — БД.

EP>Например вот это дублирование — 1, 2 — из-за БД? А может быть вот этот мрак из-за БД?


Вообще это пишется без дублей

public static TSource MinBy<TSource, TValue>(
            [NotNull, InstantHandle] this IEnumerable<TSource> source,
            [NotNull, InstantHandle] Func<TSource, TValue> selector,
            [CanBeNull] IComparer<TValue> comparer)
        {
            Code.NotNull(source, nameof(source));
            Code.NotNull(selector, nameof(selector));

            if (comparer == null)
                comparer = Comparer<TValue>.Default;

            var value = default(TValue);
            TSource item;
                       
// просто добавляем фильтр, он ленивый и будет вызываться во время итерации
            if (value == null)
                               source=source.Where(x=>x!=null);

             
                               using (var e = source.GetEnumerator())
                {
                    if (!e.MoveNext())
                                  { 
                                    // по их алгоритму при пустом списке вызвать исключение для Nullable
                                      if (value == null)
                                        throw NoElementsException();
                                          else
                    return default(TSource); // вернуть default при пустом списке 
                                    }

                    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++ и мы сравним 100 раз о которых ты декларируешь.

на C++ десять строк (+ может несколько wrapper'ов, это максимум десятки строк), на C# — несколько сотен строк кода (è1 + è2) причём включая кодогенетратор, который генерирует èнесколько тысяч строк, а алгоритм-то совсем пустяковый.


Можно подумать ты никогда не занимался копи-пасте?
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>Здравствуйте, Ночной Смотрящий, Вы писали:


EP>>>Причины могут быть какие угодные. Я же например не говорю что авторы в рамках языка/платформы неправильно поступили. Я говорю что плох тот языка/платформа на которых необходимы такие извраты для простейших алгоритмов

НС>>Извраты необходимы не из-за платформы/языка, а из-за предметной области — БД.

EP>Например вот это дублирование — 1, 2 — из-за БД? А может быть вот этот мрак из-за БД?


Вообще это пишется без дублей

public static TSource MinBy<TSource, TValue>(
            [NotNull, InstantHandle] this IEnumerable<TSource> source,
            [NotNull, InstantHandle] Func<TSource, TValue> selector,
            [CanBeNull] IComparer<TValue> comparer)
        {
            Code.NotNull(source, nameof(source));
            Code.NotNull(selector, nameof(selector));

            if (comparer == null)
                comparer = Comparer<TValue>.Default;

            var value = default(TValue);
            TSource item;
                       
// просто добавляем фильтр, он ленивый и будет вызываться во время итерации
            if (value == null)
                               source=source.Where(x=>x!=null);

             
                               using (var e = source.GetEnumerator())
                {
                    if (!e.MoveNext())
                                  { 
                                    // по их алгоритму при пустом списке вызвать исключение для Nullable
                                      if (value == null)
                                        throw NoElementsException();
                                          else
                    return default(TSource); // вернуть default при пустом списке 
                                    }

                    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++ и мы сравним 100 раз о которых ты декларируешь.

на C++ десять строк (+ может несколько wrapper'ов, это максимум десятки строк), на C# — несколько сотен строк кода (è1 + è2) причём включая кодогенетратор, который генерирует èнесколько тысяч строк, а алгоритм-то совсем пустяковый.


Можно подумать ты никогда не занимался копи-пасте?


Можно переписать на foreach

if (value == null)
                               source=source.Where(x=>x!=null);

                bool isfirst=true;
                bool fl=0;
                foreach(var item in source)
                {
                   var x = selector(item ); 
                   if (isFirst) 
                      {                  
                      isFirst=false;
                       fl=-1;
                     }
                    else
                      fl=comparer.Compare(item, value);
                                 
                        if (fl< 0)
                        {
                            value = x;
                            item = e.Current;
                        }
                    }
                
                              if (isFirst)
                  
                                  { 
                                    // по их алгоритму при пустом списке вызвать исключение для Nullable
                                      if (value == null)
                                        throw NoElementsException();
                                          else
                    r                   eturn default(TSource); // вернуть default при пустом списке 
                                    }
            return item;


Это не проблема платформы.