gpt4 book ai didi

c# - 以相同的顺序对两个单独的列表进行排序?

转载 作者:太空宇宙 更新时间:2023-11-03 22:04:28 25 4
gpt4 key购买 nike

只是先设定一些限制。由于我在其中编写代码的环境,我无法创建自己的类或方法。只是基本的程序代码。它在 CMS 中,我的代码在方法本身内部执行。

这是我的问题

在此页面上,我执行数据库查询,加载所有 700 家商店位置。然后,我根据查询字符串中的 lat 和 lng 值与数据库中的值进行距离计算,以找到 50 公里以内的商店。在那个距离内的每一个,我目前都添加到 List<DataRow> .我还获取距离结果,将其四舍五入到小数点后一位,并将其存储到 Double 类型的简单列表中。我想要做的,基本上是对这些进行排序,所以当我输出商店 + 距离值时,它是从最短到最长的距离排序的。我正在考虑切换 List<DataRow>List<Double>组合到 Dictionary<Double, DataRow>并在那里使用排序,但当然在某些情况下两个地方具有相同的距离值,因此它不会是唯一的。有没有我可以为此使用的其他集合类型,或者您能推荐一种对数据进行排序的好方法吗?

如果您需要视觉效果,这是我的代码:

PRA 对象基本上是我们用于处理 CMS 后端方面的主要对象。在这种情况下,我使用一种速记方法来查询数据,并检查请求数据中的几个变量。其余的都是内置的 .net 东西。

List<DataRow> locationsInRange = new List<DataRow>();
List<Double> distances = new List<Double>();
if(!String.IsNullOrEmpty(PRA.Request.QueryString["lat"]) && !String.IsNullOrEmpty(PRA.Request.QueryString["lng"])) {
Double earthRadius = 6371.0;
Double maxDistance = 50.0;

var locations = PRA.QueryDataRows("*", "", "{Location}", "showweb");
Double lat = Double.Parse(PRA.Request.QueryString["lat"]);
Double lng = Double.Parse(PRA.Request.QueryString["lng"]);

if(!String.IsNullOrEmpty(PRA.Request.QueryString["radius"])) {
Double temp = Double.Parse(PRA.Request.QueryString["radius"]);
if(temp > 0) {
maxDistance = temp;
}
}

bool firstError = true;
foreach(var l in locations) {
Double latSecond = 0.0;
Double lngSecond = 0.0;
try {
latSecond = Double.Parse(l["lat"].ToString());
lngSecond = Double.Parse(l["lng"].ToString());
}
catch(Exception ex) {
// do nothing. The lat and lng may not of been valid or not returned a result
}


Double dLat = Math.PI * ((lat - latSecond) / 180.0);
Double dLon = Math.PI * ((lng - lngSecond) / 180.0);

Double lat1 = Math.PI * (latSecond / 180.0);
Double lat2 = Math.PI * (lat / 180.0);

Double a = Math.Sin(dLat / 2) * Math.Sin(dLat / 2) + Math.Sin(dLon / 2) * Math.Sin(dLon / 2) * Math.Cos(lat1) * Math.Cos(lat2);
Double c = 2 * Math.Atan2(Math.Sqrt(a), Math.Sqrt(1 - a));
if(earthRadius * c <= (Double) maxDistance) {
locationsInRange.Add(l);
distances.Add(Math.Round(earthRadius * c, 1));
}
}

}

最佳答案

使用由 Tuple 类型表示的成对列表(数据、距离)...

var locations = new List<Tuple<DataRow, double>>();
locations.Add(Tuple.Create(row, distance));
locations.Sort((x, y) => x.Item2.CompareTo(y.Item2));

关于c# - 以相同的顺序对两个单独的列表进行排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8943521/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com