List<Point> points = ...;
Point selected = points.Min(item => item.X);
Здравствуйте, MikeCpp, Вы писали:
MC>Требуется найти объект в коллекции у которого значения свойства X было бы минимально (или значение некоторой f(X)).
MC>Многие похожие задачи решаются с помощью лямбда выражений и функций ForEach, Select, Where, Min и т.д. в одну строчку.
MC>Как можно было бы решить аналогичным способом эту задачу?
MC>Пример кода который хотелось бы исправить:
MC>Есть список точек:
MC>MC>List<Point> points;
MC>
MC>Надо выбрать точку с минимальной координатой X.
MC>MC>Point selected = points[0];
MC>foreach (Point point in points)
MC> if (point.X < selected.X)
MC> selected = point;
MC>
MC>Прошу прощения, за, возможно, слишком очевидный вопрос. Самостоятельно найти на него ответ я не смог. (
Требуется найти объект в коллекции у которого значения свойства X было бы минимально (или значение некоторой f(X)).
Многие похожие задачи решаются с помощью лямбда выражений и функций ForEach, Select, Where, Min и т.д. в одну строчку.
Как можно было бы решить аналогичным способом эту задачу?
Пример кода который хотелось бы исправить:
Есть список точек:
List<Point> points;
Надо выбрать точку с минимальной координатой X.
Point selected = points[0];
foreach (Point point in points)
if (point.X < selected.X)
selected = point;
Прошу прощения, за, возможно, слишком очевидный вопрос. Самостоятельно найти на него ответ я не смог. (
Здравствуйте, MikeCpp, Вы писали:
MC>Надо выбрать точку с минимальной координатой X.
/// <summary>
/// Returns the minimal element of the sequence, where 'minimal' is determined by a key value, returned by the keySelector function.
/// </summary>
/// <exception cref="ArgumentNullException">list or keySelector is null.</exception>
/// <exception cref="InvalidOperationException">list contains no elements.</exception>
public static TSource MinBy<TSource, TKey>(
this IEnumerable<TSource> list, Func<TSource, TKey> keySelector, IComparer<TKey> comparer)
{
if(list == null) throw new ArgumentNullException("list");
if(keySelector == null) throw new ArgumentNullException("keySelector");
bool selected = false;
bool atLeastOneElement = false;
TSource minElement = default(TSource);
TKey minKey = default(TKey);
if (comparer == null)
comparer = Comparer<TKey>.Default;
foreach (TSource currentElement in list)
{
atLeastOneElement = true;
if(currentElement == null)
continue;
TKey currentKey = keySelector(currentElement);
if (!selected)
{
minElement = currentElement;
minKey = currentKey;
selected = true;
continue;
}
if (comparer.Compare(currentKey, minKey) < 0)
{
minElement = currentElement;
minKey = currentKey;
}
}
if (!atLeastOneElement)
throw new InvalidOperationException("Source sequence contains no elements. Minimal element can not be determined.");
return minElement;
}
...
Point leftMostPoint = points.MinBy(p => p.X);
Забыл еще перегрузку, а то скажете, мол, не компилируется пример
/// <summary>
/// Returns the minimal element of the sequence, where 'minimal' is determined by a key value, returned by the keySelector function.
/// </summary>
/// <exception cref="ArgumentNullException">list or keySelector is null.</exception>
/// <exception cref="InvalidOperationException">list contains no elements.</exception>
public static TSource MinBy<TSource, TKey>(this IEnumerable<TSource> list, Func<TSource, TKey> keySelector)
{
return list.MinBy(keySelector, null);
}
Здравствуйте, dump, Вы писали:
D>List<Point> points = ...;
D>Point selected = points.Min(item => item.X);
Жалко только, что не скомпилируется, да?
Здравствуйте, MozgC, Вы писали:
MC>MC>public static TSource MinBy<TSource, TKey>
Спасибо! Это то, что нужно.