Найдите расстояние, необходимое для навигации по списку точек, используя linq - PullRequest
3 голосов
/ 09 февраля 2010

Используя linq для IEnumerable из двухмерных точек, найдите расстояние, необходимое для навигации по всем точкам, при условии, что точки посещены в порядке их появления в списке.

Я думал, что смогу каким-то образом использовать функцию .Aggregate <>, но не могу понять, как заставить ее работать. Проблема в том, что агрегат возвращает тот же тип, что и список, что является точкой, мне нужен скаляр (двойной).

Если эта проблема не решаема с помощью linq, было бы интересно узнать, какой класс проблемы может и какой класс проблемы не может быть решен с помощью linq.

Это не домашняя работа, а необходимый шаг в личном проекте, чтобы помочь мне выучить linq.

Ответы [ 2 ]

5 голосов
/ 09 февраля 2010

Это намного проще, если вы используете (или копируете) метод расширения Zip, доступный в .net 4 :

var distances = points.Zip(points.Skip(1), Distance);
double totalDistance = distances.Sum();

с использованием метода Distance:

double Distance(Point p1, Point p2)
{
    double dx = p1.X-p2.X;
    double dy = p1.Y-p2.Y;
    return Math.Sqrt( dx*dx+dy*dy );
}

Барт объясняет (и показывает вам, как реализовать) zip в своем блоге:

static class Enumerable 
{ 
    public static IEnumerable<TResult> Zip<TFirst, TSecond, TResult>(this IEnumerable<TFirst> first, IEnumerable<TSecond> second, Func<TFirst, TSecond, TResult> func) 
    { 
        var ie1 = first.GetEnumerator(); 
        var ie2 = second.GetEnumerator();

        while (ie1.MoveNext() && ie2.MoveNext()) 
            yield return func(ie1.Current, ie2.Current); 
    } 
}
1 голос
/ 09 февраля 2010

Как насчет этого? Предполагая, что:

struct Point 
{
 public int X;
 public int Y;
 public Point(int x, int y) { X=x; Y=y; }
}

double Distance(Point p1, Point p2)
{
    return Math.Sqrt( Math.Pow(p1.X-p2.X,2) + Math.Pow(p1.Y-p2.Y,2) );
}

var list = new List<Point>{...};

Тогда

var distance = list
    .Select( (p,i) => i == list.Count-1? 0 : Distance(p,list[i+1]) ).Sum();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...