从动态数据表中查找行中的最小值
Posted
技术标签:
【中文标题】从动态数据表中查找行中的最小值【英文标题】:Find Min value in row from Dynamic Datatable 【发布时间】:2013-09-13 15:31:32 【问题描述】:所以我有 2 个数据表,第一个数据表是一个传统的数据表,它从某些 sql 语句中获取数据。
数据表1:
| user_point | | lat | | lng | | radius |
--------------------------------------------------------------
| userpoint0 | | 43.702943 | | -79.37478 | | 3.10685596 |
| userpoint1 | | 43.672655 | | -79.479837 | | 4.970969536 |
但是,某些列是根据数据表 1 中的用户点数在数据表 2 中动态生成的。
| id | | lat | | lng | | DistanceFromUserpoint0 | | DistanceFromUserpoint1 |
-------------------------------------------------------------------------------------------------------------
| 23184 | | 43.6495246887207 | | -79.4244003295898 | | 4.4464409231533 | | 3.19880848195014 |
| 37957 | | 43.6372413635254 | | -79.4151458740234 | | 4.96760996486758 | | 4.05524888969018 |
| 37965 | | 43.636589050293 | | -79.4169921875 | | 5.04670564187353 | | 4.00990129127938 |
| 60467 | | 43.735538482666 | | -79.4437942504883 | | 4.11692339031897 | | 4.70303114025665 |
| 60475 | | 43.735538482666 | | -79.4437942504883 | | 4.11692339031897 | | 4.70303114025665 |
| 65615 | | 43.7292861938477 | | -79.4317932128906 | | 3.37923630122185 | | 4.59015403452972 |
| 65623 | | 43.7292861938477 | | -79.4317932128906 | | 3.37923630122185 | | 4.59015403452972 |
| 3196486 | | 43.6624603271484 | | -79.4242172241211 | | 3.7316961595166 | | 2.86768157143755 |
| 3196494 | | 43.6624603271484 | | -79.4242172241211 | | 3.7316961595166 | | 2.86768157143755 |
| 5756393 | | 43.719165802002 | | -79.4295654296875 | | 2.95683309139676 | | 4.07847187106957 |
| 5756922 | | 43.719165802002 | | -79.4295654296875 | | 2.95683309139676 | | 4.07847187106957 |
| 5756956 | | 43.719165802002 | | -79.4295654296875 | | 2.95683309139676 | | 4.07847187106957 |
| 5756991 | | 43.719165802002 | | -79.4295654296875 | | 2.95683309139676 | | 4.07847187106957 |
| 5757096 | | 43.719165802002 | | -79.4295654296875 | | 2.95683309139676 | | 4.07847187106957 |
| 5757134 | | 43.719165802002 | | -79.4295654296875 | | 2.95683309139676 | | 4.07847187106957 |
现在我将在数据表 2 的末尾添加一个名为 Closest_userpoint
的新列,它将存储距离的值,该距离是该行最近的用户点。
所以现在我的问题是如何找到该行的最小/最小值,该行具有动态生成的列(这意味着可以有从无到 100 的任意数量的用户点)。我正在寻找一个最简单最有效的答案,谢谢
编辑:
这是我如何创建动态列的代码,但是我坚持要根据距离用户点的距离,找出用该行的最小值填充最接近用户点列的逻辑
编辑 2:
额外问题:
最后,我想确定最接近的 Point/Min 值是否在最接近的用户点的 raidus 范围内。
【问题讨论】:
有几种方法可以做到这一点。你能告诉我们你到目前为止尝试/想到了什么吗? 我发布了我的代码,说明我是如何动态计算距离用户点的距离并创建列的 不确定是否相关,但 SQL2008 会使用一些新的地理特征为您执行这种“离 X 最近的点” 我希望一切都在 C# 代码本身中完成,因为我根本没有在 sql 中保存我的距离值,因为有列是动态生成的,如果我保存它们不会很有效在这样的sql中 @AdrianCarneiro 如果我可以用 sql 本身更有效地做到这一点,而不使用 c# 请建议如何编写我的查询来获取最近点、table1(userpoint, lat, lng, radius) 和 table2 (id, lat, lng) 【参考方案1】:如果您在填充值后尝试找到最小值会更容易
使用 System.Linq;对于 Min() 方法
if (userpoints.Rows.Count > 1)
foreach (DataRow dr in selectedPanels.Rows)
List<string> alluserpoints = new List<string>();
for (int i = 0; i < userpoints.Rows.Count; i++)
if (Convert.ToDouble(userpoints.Rows[i].radius) > Convert.ToDouble(dr["DistanceFromUserpoint" + i]))
alluserpoints.Add(dr["DistanceFromUserpoint" + i]+"+userpoint"+i);
if(alluserpoints.Count>0)
dr["Closest_UserPoint"] = alluserpoints.Min();
else
dr["Closest_UserPoint"] ="none";
else
foreach(DataRow dr in selectedPanels.Rows)
if(Convert.ToDouble(userpoints.Rows[0].radius>Convert.ToDouble(dr["DistanceFromUserpoint0"])
dr["Closest_UserPoint"]=dr["DistanceFromUserpoint0"]+"+userpoint0";
else
dr["Closest_UserPoint"]="none";
【讨论】:
我不想使用 Linq,因为我没有在代码中的其他任何地方使用它。这可行,但你能建议一个不使用 linq 的解决方案吗? 另外,我还需要弄清楚。如果该最近点/距离在该用户点的半径范围内。 然后您可以使用 Sort() 方法对所有用户点列表进行排序,并将所有用户点 [0] 分配给最近的用户点。它不是最有效的解决方案,但如果您真的特别喜欢在 C# 代码中执行此操作,请使用它。 @programmer_41 哦,那我猜你必须使用 LINQ。在没有 LINQ 的情况下这样做太复杂了。 @programmer_41 我已经编辑了我的答案,以便只考虑半径内的距离并将其添加到列表中。以上是关于从动态数据表中查找行中的最小值的主要内容,如果未能解决你的问题,请参考以下文章