You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 04:39:15