如何在C#中计算两点距离并将var类型转换为double?
解决两点距离计算与类型转换问题
嘿,我来帮你搞定这两个问题:把var类型的数值转成可计算的double,还有实现两点间的距离公式。
一、把DataRow中的值转换为double
从DataRow.ItemArray里取出来的元素本质是object类型,你用var声明时编译器会自动推断为object,自然没法直接做加减乘除。这里有两种靠谱的转换方式:
1. 直接转换(适合确定数值格式没问题的场景)
用Convert.ToDouble()一步转成double:
double x1 = Convert.ToDouble(array1[7]); double y1 = Convert.ToDouble(array1[8]); double x2 = Convert.ToDouble(array2[7]); double y2 = Convert.ToDouble(array2[8]);
2. 安全转换(推荐,避免格式错误炸锅)
用double.TryParse()做容错处理,如果转换失败能及时捕获:
if (!double.TryParse(array1[7].ToString(), out double x1)) { Console.WriteLine("x1的格式不对,跳过这行数据"); continue; } // 用同样的方式处理y1、x2、y2
二、实现两点间距离公式
咱们用欧几里得距离公式就行,公式是:
距离 = √[(x₂ - x₁)² + (y₂ - y₁)²]
在C#里有两种实现方式,第二种性能稍好一点:
// 方式1:用Math.Pow计算平方 double distance = Math.Sqrt(Math.Pow(x2 - x1, 2) + Math.Pow(y2 - y1, 2)); // 方式2:直接用乘法算平方(更高效) double dx = x2 - x1; double dy = y2 - y1; double distance = Math.Sqrt(dx * dx + dy * dy);
三、修改后的完整代码
我把你的代码做了调整,加入了类型转换和距离计算,还加了结果输出:
using System; using System.Data; using System.Linq; namespace Console1 { class Program { static void Main(string[] args) { DataTable dt1 = ConvertToDataTable(@"C:\Users\manchunl\Desktop\Sample1.txt", 10); DataTable dt2 = ConvertToDataTable2(@"C:\Users\manchunl\Desktop\Sample2.txt", 10); foreach (DataRow row1 in dt1.Rows) { foreach (DataRow row2 in dt2.Rows) { var array1 = row1.ItemArray; var array2 = row2.ItemArray; // 匹配第5列数据(索引从0开始,array[4]对应第5列) if (array2[4].Equals(array1[4])) { // 安全转换坐标值为double if (!double.TryParse(array1[7].ToString(), out double x1) || !double.TryParse(array1[8].ToString(), out double y1) || !double.TryParse(array2[7].ToString(), out double x2) || !double.TryParse(array2[8].ToString(), out double y2)) { Console.WriteLine("坐标格式错误,跳过当前匹配项"); continue; } // 计算两点距离 double dx = x2 - x1; double dy = y2 - y1; double distance = Math.Sqrt(dx * dx + dy * dy); // 输出计算结果,保留两位小数 Console.WriteLine($"匹配行的两点距离:{distance:F2}"); } } } Console.WriteLine(); Console.WriteLine("Press enter to exit."); Console.Read(); } public static DataTable ConvertToDataTable(string filePath, int numberOfColumns) { DataTable tbl = new DataTable(); for (int col = 0; col < numberOfColumns; col++) tbl.Columns.Add(new DataColumn("Column" + (col + 1).ToString())); string[] lines = System.IO.File.ReadAllLines(filePath); foreach (string line in lines) { var cols = line.Split(null); DataRow dr = tbl.NewRow(); for (int cIndex = 0; cIndex < numberOfColumns; cIndex++) { dr[cIndex] = cols[cIndex]; } tbl.Rows.Add(dr); } return tbl; } public static DataTable ConvertToDataTable2(string filePath, int numberOfColumns) { DataTable tbl = new DataTable(); for (int col = 0; col < numberOfColumns; col++) tbl.Columns.Add(new DataColumn("Column" + (col + 1).ToString())); string[] lines = System.IO.File.ReadAllLines(filePath); foreach (string line in lines) { var cols = line.Split(','); DataRow dr = tbl.NewRow(); for (int cIndex = 0; cIndex < numberOfColumns; cIndex++) { dr[cIndex] = cols[cIndex]; } tbl.Rows.Add(dr); } return tbl; } } }
小提示
- 你之前写的两个
foreach循环用了string.Join但没做输出,要是没用可以删掉,或者改成输出每行内容用来调试。 - 如果你的文本文件第一行是表头,记得在读取时跳过,不然会把表头当成数据转换出错哦。
内容的提问来源于stack exchange,提问作者apple orange
相关产品推荐
相关产品推荐

