双阵列的问题?

时间:2011-12-15 15:52:29

标签: c# arrays parsing

我需要创建一个从.cvs文件读取数据的程序,并使用这些(x,y和z)值进行一系列计算。

我在文件中读取字符串,然后将其拆分为3个较小的x,y和z字符串。

x,y和z坐标表示湖泊轮廓的x和y坐标以及深度(z)。 我必须做的一项计算是使用公式(x[i]*y[i+1])-(x[i+1]*y[i])计算湖面积,z(depth) = 0

我可以让我的代码完美运行,直到x[i+1]y[i+1],它一直给我一个0的值。

有人可以告诉我如何解决这个问题吗?

这是我的代码;

{
    string[] ss = File.ReadAllLines(@"C:File.csv");

    for (int i = 1; i < ss.Length; i++)
    {
        string[] valuesAsString = ss[i].Split(new char[] { ' ', ',' }, StringSplitOptions.RemoveEmptyEntries);

        double[] X = new double[valuesAsString.Length];
        double[] Y = new double[valuesAsString.Length];
        double[] Z = new double[valuesAsString.Length];

        for (int n = 0; n < 1; n++)
        {
            X[n] = double.Parse(valuesAsString[0]);
            Y[n] = double.Parse(valuesAsString[1]);
        }

        do
        {
            double SurfaceArea = (X[n] * Y[n + 1]) - (X[n + 1] * Y[n]);

            Console.WriteLine(SurfaceArea);
        }

        while (Z[n] == 0);
   }
}

4 个答案:

答案 0 :(得分:0)

在调试器中逐步执行代码。特别注意线的行为

        for (int n = 0; n < 1; n++) 

这个循环会执行多少次?在循环的每次迭代中,n的值是多少?

答案 1 :(得分:0)

嗯,我注意到的一件事是当你设置你的X,Y,Z变量时,你将它设置为数组对象的长度而不是它的值 - 这是故意的吗?

在行上放置一个调试中断:     double SurfaceArea =(X [n] * Y [n + 1]) - (X [n + 1] * Y [n]); 并检查数据类型“X”,“Y”和“Z”

我在过去遇到过问题,它试图将它们计算为字符串(因为它将数据源作为字符串从数据源中取出)。我最后通过将CInt()添加到每个变量(或Convert.ToInt32();)来修复它。

希望这有帮助。

答案 2 :(得分:0)

由于这可能是一个家庭作业问题,我试图不直接解决我的答案,但我看到你应该检查的代码中有一些可疑的部分。

  1. 为什么X,Y,Z阵列?您每次通过外部循环创建一个新数组,将数组的长度设置为行中元素的数量,然后仅将值分配给X和Y的一个元素,并且永远不会将Z赋值给任何东西。

  2. 正如phoog在答案中所说,目的是什么:for (int n = 0; n < 1; n++)

  3. 你想用do-while循环做什么?正如Skeet先生的评论中提到的,X[n]Y[n]Z[n]不存在,因为n在循环之外不存在它被声明为。即使它确实存在,Z[n]总是为零,因为在初始化之后你永远不会为Z数组赋值,所以do-while循环将永远运行。

答案 3 :(得分:0)

好的,我不确定我是否做对了,所以如果你看看我做了什么,告诉我它是否有任何帮助。

稍后回顾一下我想出了以下内容:

的类
    public class ValueXyz
    {
        public double X { get; set; }
        public double Y { get; set; }
        public int Z { get; set; }

    }

管理计算的课程:

    public class SurfaceCalculator
    {

    private ValueXyz[] _valuesXyz;
    private double _surface;
    private readonly string _textWithValues;

    public SurfaceCalculator(string textWithValues)
    {
        _textWithValues = textWithValues;
        SetValuesToCalculate();
    }

    public double Surface
    {
        get { return _surface; }
    }

    public void CalculateSurface()
    {

        for (var i = 0; i < _valuesXyz.Length; i++)
        {
            if (_valuesXyz[i].Z == 0)
                _surface = (_valuesXyz[i].X*_valuesXyz[i + 1].Y) - (_valuesXyz[i + 1].X*_valuesXyz[i].Y);
        }

    }


    private void SetValuesToCalculate()
    {
        var valuesXyz = _textWithValues.Split(' '); 


        _valuesXyz = valuesXyz.Select(item => new ValueXyz
                                                  {
                                                      X = Convert.ToDouble(item.Split(',')[0]),
                                                      Y = Convert.ToDouble(item.Split(',')[1]),
                                                      Z = Convert.ToInt32(item.Split(',')[2])
                                                  }).ToArray();

    }


}

所以现在你的客户端代码可以做一些事情:

   [TestMethod]
    public void TestSurfaceCalculatorGetsAValue()
    {
        //var textWithValues = File.ReadAllText(@"C:File.csv");
        var textWithValues = "424.26,424.26,0 589.43,231.46,0 720.81,14.22,1";
        var calculator = new SurfaceCalculator(textWithValues);
        calculator.CalculateSurface();

        Assert.IsNotNull(calculator.Surface);
    }

我不太确定我对如何实现公式的想法是正确的,但我只是想揭示一个你可以使用的替代方案,你可以永远不会有很多方法做一件事:)。

干杯。

顺便说一下,我的意图的一部分,并没有将你的功能与csv联系起来,以防将来你的文本来源发生变化。