private void Process() { foreach(TestCase tc in _lstTestCases) { foreach(Atrraction attraction in _lstAttractions) { PointD p1 = new PointD(tc.Longitude, tc.Latitude); PointD p2 = new PointD(attraction.Longitude, attraction.Latitude); double distance = Math.Round(DistanceBetween(p1,p2), 2); double speed = 0; switch(tc.PreferredTransport) { case __METRO: speed = _METROSPEED_; break; case __BIKE: speed = _BIKESPEED_; break; case __FOOT: speed = _FOOTSPEED_; break; } if(distance/speed <= tc.Minutes) { _dictSelectedAttractions.Add(attraction.Id, distance); } } var sortedDict = from entry in _dictSelectedAttractions orderby entry.Value ascending select entry.Key; Console.WriteLine(string.Join(" ", sortedDict.ToArray())); _dictSelectedAttractions.Clear(); } }
protected double DistanceBetween(PointD p1, PointD p2) { int EARTH_RADIUS = 6371;//in km double point1_lat_in_radians = Degree2Radians(p1.Y); double point2_lat_in_radians = Degree2Radians(p2.Y); double point1_long_in_radians = Degree2Radians(p1.X); double point2_long_in_radians = Degree2Radians(p2.X); return Math.Acos( Math.Sin( point1_lat_in_radians ) * Math.Sin( point2_lat_in_radians ) + Math.Cos(point1_lat_in_radians) * Math.Cos(point2_lat_in_radians) * Math.Cos(point2_long_in_radians - point1_long_in_radians)) * EARTH_RADIUS; }