Re: Лямбда-выражения
От: dump Россия  
Дата: 12.02.11 12:53
Оценка: :)
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>Прошу прощения, за, возможно, слишком очевидный вопрос. Самостоятельно найти на него ответ я не смог. (
Лямбда-выражения
От: MikeCpp  
Дата: 16.07.10 07:51
Оценка:
Требуется найти объект в коллекции у которого значения свойства 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;


Прошу прощения, за, возможно, слишком очевидный вопрос. Самостоятельно найти на него ответ я не смог. (
Re: Лямбда-выражения
От: dump Россия  
Дата: 12.02.11 11:43
Оценка:
День добрый =)

Решение:

Установить ReSharper и он всё сам сделает =)
Re: Лямбда-выражения
От: MozgC США http://nightcoder.livejournal.com
Дата: 12.02.11 12:06
Оценка:
Здравствуйте, 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);
Re[2]: Лямбда-выражения
От: dump Россия  
Дата: 12.02.11 12:24
Оценка:
Потрясающий ответ.
Re[2]: Лямбда-выражения
От: MozgC США http://nightcoder.livejournal.com
Дата: 12.02.11 12:38
Оценка:
Забыл еще перегрузку, а то скажете, мол, не компилируется пример

/// <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);
}
Re[2]: Лямбда-выражения
От: MozgC США http://nightcoder.livejournal.com
Дата: 12.02.11 13:21
Оценка:
Здравствуйте, dump, Вы писали:

D>List<Point> points = ...;

D>Point selected = points.Min(item => item.X);

Жалко только, что не скомпилируется, да?
Re[3]: Лямбда-выражения
От: Аноним  
Дата: 16.02.11 07:16
Оценка:
Если есть:
— референс на System.Core, в котором есть System.Linq, в .Net4.0
То будет:
— счастье
Re[2]: Лямбда-выражения
От: MikeCpp  
Дата: 21.02.11 07:54
Оценка:
Здравствуйте, MozgC, Вы писали:

MC>
MC>public static TSource MinBy<TSource, TKey>


Спасибо! Это то, что нужно.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.