操纵存储在数组中的信息

时间:2013-06-04 14:49:07

标签: c# arrays

我有很多数据存储在多个数组中,我希望得到一个值,但我遇到了麻烦。标识符数组是

String[] seqNum2 = new String[600];
String[] seqNum = new String[600];

我希望能够在这些数组中找到匹配数据并获取与这些数组中的数据一致的信息

String[] netOil2 = new String[600];
String[] netOil = new String[600];

所以这是我的代码到目前为止,但它没有输出我想要的正确答案,所有它输出的是一个无限循环,说“System.String [],NaN”。

    private void netOilRadBtn_CheckedChanged(object sender, EventArgs e)
    {
        StreamWriter sw = new StreamWriter("test.txt"); //testing purposes only
        //StreamReader sr = new StreamReader("OUTPUT.CSV");
        double first;
        double second;


        for (int i = 0; i < netOil2.Length; i++)
            {
                for (int j = 0; j < netOil.Length; j++)
                {
                    if (seqNum2[i] == seqNum[j])
                    {
                        //sw.WriteLine("Find New Seq Num");
                        first = Convert.ToDouble(netOil2[i]);
                        second = Convert.ToDouble(netOil[j]);

                        double answer = (first - second) / first;

                        sw.WriteLine("{0}, {1}", seqNum2, answer);
                    }
                }
            }

    }

我希望能够做的就是输出匹配的seqNum然后输出双重答案。任何帮助将不胜感激。

4 个答案:

答案 0 :(得分:2)

所以,这一行:

sw.WriteLine("{0}, {1}", seqNum2, answer);

输出System.String[], NaN

seqNum2是一个数组,这就是你在输出中得到System.String[]的原因。如果您想查看当前正在处理的seqNum2[i]元素,您可能需要seqNum2。当然,既然你没有初始化数组元素(见下文),即使有了这个改变,你也看不到你所期望的,因为值是null并且它被格式化为一个空字符串,所以你会得到, Nan作为输出。

您在输出中获得NaN的原因是行:

double answer = (first - second) / first;

我猜firstsecond都是0.如果只有第一个是0,那么你会得到Infinity,否则你会得到0。

这些值最有可能设置为0,因为您没有在netOilnetOil2数组中设置字符串值,因此您有600 null次和Convert.ToDouble(null)次返回0

调试代码,查看您调用的值Convert.ToDouble以及返回的值是什么。

答案 1 :(得分:1)

private void netOilRadBtn_CheckedChanged(object sender, EventArgs e)
{
    using (var sw = new StreamWriter("test.txt")) //testing purposes only
    { 
        //StreamReader sr = new StreamReader("OUTPUT.CSV");

        var items =  netOil.Zip(seqNum, (oil, seq) => new {Oil = oil, Seq = seq});
        var items2 =  netOil2.Zip(seqNum2, (oil, seq) => new {Oil = oil, Seq = seq});

        foreach (var item in items.Join(items2,
                     i=>i.Seq,i=>i.Seq, (a,b)=>
                     {
                         double first = Convert.ToDouble(a.Oil);
                         double second = Convert.ToDouble(b.Oil);

                         double answer = (first - second) / first;
                         return string.Format("{0}, {1}", a.Seq, answer);
                     }))

        { 
            sw.WriteLine(item);
        }
    }
}

答案 2 :(得分:0)

你得到“System.String []”,因为你正在调用Array.ToString()。你得到NaN,因为显然答案是NaN。我猜是其中一个

                    first = Convert.ToDouble(netOil2[i]);
                    second = Convert.ToDouble(netOil[j]);

返回NaN。在这些行中放置一个断点并检查netOil2 [i] netOil [j]的值是否实际代表数字(请记住Convert.ToDouble返回的内容是基于您当前的文化)。

答案 3 :(得分:0)

我会使用Dictionary个集合而不是对数组。

例如:

Dictionary<Int32, Double> dictOil1 = new Dictionary<Int32, Double();
Dictionary<Int32, Double> dictOil2 = new Dictionary<Int32, Double();

//If seqNum and netOil _really are_ strings...
Int32 seq, seq2;
Double oil, oil2;
if (Int32.TryParse(seqNum, out seq) && Double.TryParse(netOil, out oil))
    dictOil1.Add(seq, oil);
if (Int32.TryParse(seqNum2, out seq2) && Double.TryParse(netOil2, out oil2))
    dictOil2.Add(seq2, oil2);