首页 / C# / c# – 找到与双打数组最接近的匹配项
c# – 找到与双打数组最接近的匹配项
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – 找到与双打数组最接近的匹配项,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2345字,纯文字阅读大概需要4分钟。
内容图文
![c# – 找到与双打数组最接近的匹配项](/upload/InfoBanner/zyjiaocheng/783/71a5a3de3f2f46d481eec339576566cc.jpg)
鉴于下面的代码,如何将对象列表的值与测试值进行比较?
我正在构建一个地理定位应用程序.我将在经度和纬度上传递,并希望服务回答最接近这些值的位置.
我开始转换为字符串的路径,并将值格式化为两个小数位,但这似乎有点太多了,我正在寻找一个更优雅的解决方案.
public class Location : IEnumerable
{
public string label { get; set; }
public double lat { get; set; }
public double lon { get; set; }
//Implement IEnumerable
public IEnumerator GetEnumerator()
{
return (IEnumerator)this;
}
}
[HandleError]
public class HomeController : Controller
{
private List<Location> myList = new List<Location>
{
new Location {
label="Atlanta Midtown",
lon=33.657674,
lat=-84.423130},
new Location {
label="Atlanta Airport",
lon=33.794151,
lat=-84.387228},
new Location {
label="Stamford, CT",
lon=41.053758,
lat=-73.530979}, ...
}
public static int Main(String[] args)
{
string inLat = "-80.987654";
double dblInLat = double.Parse(inLat);
// here's where I would like to find the closest location to the inLat
// once I figure out this, I'll implement the Longitude, and I'll be set
}
解决方法:
如果你不想得到奇怪的结果,你会想要使用正确的距离公式:
double CalculateDistance(double lat1, double lon1, double lat2, double lon2)
{
const double R = 6371;
return Math.Acos(
Math.Sin(lat1) * Math.Sin(lat2) +
Math.Cos(lat1) * Math.Cos(lat2) * Math.Cos(lon2 - lon1)) * R;
}
我希望这是正确的公式,我的数学可能会有点生疏.所有参数都需要以rad为单位,因此如果您以度为单位输入输入,请编写实用程序方法:
double DegToRad(double deg)
{
return deg * Math.PI / 180.0;
}
无论如何,在那之后,你可以找出最短的距离:
Location GetClosestLocation(Location origin)
{
double olatr = DegToRad(origin.Lat);
double olonr = DegToRad(origin.Lon);
return
(from l in locations
let latr = DegToRad(l.Lat)
let lonr = DegToRad(l.Lon)
orderby CalculateDistance(latr, lonr, olatr, olonr))
.FirstOrDefault();
}
这在技术上并不是最高性能的解决方案,因为它必须进行排序,但是没有漂亮的Linq扩展方法来使用投影进行min.如果你想要,你必须编写自己的foreach循环:
Location GetClosestLocation(Location origin)
{
double olatr = DegToRad(origin.Lat);
double olonr = DegToRad(origin.Lon);
Location closest = null;
double minDistance = double.MaxValue;
foreach (Location l in locations)
{
double latr = DegToRad(l.Lat);
double lonr = DegToRad(l.Lon);
double dist = CalculateDistance(latr, lonr, olatr, olonr));
if (dist < minDistance)
{
minDistance = dist;
closest = l;
}
}
return closest;
}
内容总结
以上是互联网集市为您收集整理的c# – 找到与双打数组最接近的匹配项全部内容,希望文章能够帮你解决c# – 找到与双打数组最接近的匹配项所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。