Сообщение 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 — из-за БД? А может быть вот этот мрак из-за БД?
Вообще это пишется без дублей
Проблема не в языке. Напиши этот же алгоритм для C++ и мы сравним 100 раз о которых ты декларируешь.
Можно подумать ты никогда не занимался копи-пасте?
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 — из-за БД? А может быть вот этот мрак из-за БД?
Вообще это пишется без дублей
Проблема не в языке. Напиши этот же алгоритм для C++ и мы сравним 100 раз о которых ты декларируешь.
Можно подумать ты никогда не занимался копи-пасте?
Можно переписать на foreach
Это не проблема платформы.
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;
Это не проблема платформы.