0

我有很多数据存储在多个数组中,我想从中获取一个值,但我遇到了麻烦。标识符数组是

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

4 回答 4

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数组中设置字符串值,因此您有 600null秒并Convert.ToDouble(null)返回 0。

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

于 2013-06-04T14:56:29.043 回答
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);
        }
    }
}
于 2013-06-04T15:05:03.027 回答
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);
于 2013-06-04T15:08:06.923 回答
0

因为调用 Array.ToString(),所以得到“System.String[]”。你得到 NaN,因为显然答案是 NaN。我的猜测是其中之一

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

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

于 2013-06-04T14:58:54.080 回答