static class Extensions {
public static TSource MinItem<TSource, TCompareValue>(
this IEnumerable<TSource> source,
Func<TSource, TCompareValue> comparerExpression) {

// Vytvome instanci typu Comparer<T> 
// pro porovnvan typ.
Comparer<TCompareValue> comparer = Comparer<TCompareValue>.Default;
// indexElement se pouv pro sputn dvou odlinch sek kdu
// ve vrazu lambda pro opertor Aggregate: jeden pro prvn 
// iteraci, druh pro nsledn prchody.
int indexElement = 0;
// Opertor Aggregate provede vraz lambda 
// pro kad element ve zdrojov sekvenci.
return source.Aggregate(
default(TSource),
(minValue, item) =>
(indexElement++ == 0 ?
// Prvn iterace  bez porovnvn,
// vrac poloku jako poten hodnotu minValue.
item :
// Nsledn iterace: dochz k porovnvn 
// a poloka se vrt, pokud je ni ne pedchoz 
// hodnota minValue; v opanm ppad se vrt minValue.
(comparer.Compare( comparerExpression(item),
comparerExpression(minValue)) < 0 ?
item :
minValue)));
}
}
