От: | Serginio1 | https://habrahabr.ru/users/serginio1/topics/ | |
Дата: | 09.07.16 20:36 | ||
Оценка: | -1 |
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;
}
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# 30 строк. При этом используя foreach можно сокаратить до С++ кода. Но даже этот вариант меньше чем ты нашел где то сотни строк.Для сравнения C#, свежий пример — на C++ десять строк (+ может несколько wrapper'ов, это максимум десятки строк), на C# — несколько сотен строк кода (è1 + è2) причём включая кодогенетратор, который генерирует èнесколько тысяч строк, а алгоритм-то совсем пустяковый.