如何迭代二维数组

时间:2011-03-19 11:00:32

标签: c# multidimensional-array foreach loops

我有两个列表,我将它们转换为单个二维数组,如下所示:

double[,] data = new double[voltage.Count(), 2];
for (int i = 0; i < voltage.Count(); i++)
{
    data[i, 0] = voltage[i];
    data[i, 1] = current[i];
}

现在我试图通过这个数组进行迭代,但我得到的是每行中电压和电流的相同值:

foreach (double data in ztr.GetCurveDataForTestType()) //this will return my array
{
    richTextBox1.AppendText("Voltage" + data + "    ---------    ");
    richTextBox1.AppendText("Current" + data + "\r\n");
}
  

电压-0.175 ---------电流-0.175
  电压-9.930625E-06 ---------电流-9.930625E-06
  电压-0.171875 ---------电流-0.171875
  电压-9.53375E-06 ---------电流-9.53375E-06
  电压-0.16875 ---------电流-0.16875

正如您在第一行中看到的那样,电压和电流都是相同的电压值,而在第二个原始电压上,它们又是相同的,但这次它是当前值。我该如何解决这个问题?

3 个答案:

答案 0 :(得分:2)

我建议使用多维数组。

相反,你可以创建一个这样的类:

class Measurement
{
    public double Voltage { get; set; }
    public double Current { get; set; }
}

并更改您的方法以返回IEnumerable<Measurement>。在.NET 4.0中,您可以使用Zip

public IEnumerable<Measurement> GetCurveDataForTestType()
{
    return voltage.Zip(current,
        (v, c) => new Measurement { Voltage = v, Current = c});
}

对于旧版本的.NET:

public IEnumerable<Measurement> GetCurveDataForTestType()
{
    for (int i = 0; i < voltage.Count(); i++)
    {
        yield return new Measurement
        {
            Voltage = voltage[i],
            Current = current[i]
        };
    }
}

然后您的代码变为:

foreach (Measurement data in ztr.GetCurveDataForTestType())
{
    richTextBox1.AppendText(
        "Voltage: {0} ---------  Current: {1}", data.Voltage, data.Current);
}

答案 1 :(得分:1)

使用与创建数组时相同的循环:

for (int i = 0; i < data.GetLength(0); i++) {
  richTextBox1.AppendText("Voltage" + data[i, 0] + "    ---------    ");
  richTextBox1.AppendText("Current" + data[i, 1] + "\r\n");
}

答案 2 :(得分:0)

<强>更新 此问题似乎与How to foreach through a 2 dimensional array?重复。链接的答案有一个替代解决方案,可以通过从二维数组切换到数组数组来使用foreach。


带有二维数组的

foreach将按顺序返回数组中的每个double值(按设计)。

例如,给定以下二维二维数组:

var array = new double[,] { { 0, 1, }, { 2, 3 }, { 4, 5 } };

foreach (var d in array)
{
    Console.WriteLine(d);
}

您将获得以下控制台输出:

0
1
2
3
4
5

因此,foreach不适合您的需求。您应该使用for循环。